在Django的管理員中,我已經看到如何使用GET變量設置'add object'表單的字段(例如/admin/app/model/add?title=lol
將'Title'字段設置爲'lol')。Django admin:如何從GET變量填充新對象?
但是,我希望能夠沿着/admin/app/model/add?key=18
的方向行事,並從另一個模型的實例爲我的字段加載默認數據。理想情況下,我也希望能夠對填充表單的值進行一些處理。我該怎麼做呢?
在Django的管理員中,我已經看到如何使用GET變量設置'add object'表單的字段(例如/admin/app/model/add?title=lol
將'Title'字段設置爲'lol')。Django admin:如何從GET變量填充新對象?
但是,我希望能夠沿着/admin/app/model/add?key=18
的方向行事,並從另一個模型的實例爲我的字段加載默認數據。理想情況下,我也希望能夠對填充表單的值進行一些處理。我該怎麼做呢?
我設法弄明白了。覆蓋整個add_view
方法似乎對我來說太複雜了。謝天謝地,Django允許你替換request
的GET
字典(它用於預先填充管理表單)。以下爲我工作:
class ArticleAdmin(admin.ModelAdmin):
// ...
def add_view(self, request, form_url='', extra_context=None):
source_id = request.GET.get('source',None)
if source_id != None:
source = FeedPost.objects.get(id=source_id)
// any extra processing can go here...
g = request.GET.copy()
g.update({
'title':source.title,
'contents':source.description + u"... \n\n[" + source.url + "]",
})
request.GET = g
return super(ArticleAdmin, self).add_view(request, form_url, extra_context)
這樣,我獲得的URL參數的「源」對象,加載我從它需要的值,做什麼,我想和他們,和預填充形成。
您可以覆蓋ModelAdmin
實例的方法add_view
。添加獲取對象,將對象的pk
設置爲None
,並將該對象作爲instance
提供給表單。帶有pk == None
的對象將始終作爲表格中的數據庫中的新對象插入save()
我不確定你的意思。我玩過add_view;然而,超級方法返回一個呈現的形式,我不知道如何預先填充它。 – egasimus 2012-04-19 13:59:30
不要使用超級方法。只需更改[表單創建](https://code.djangoproject.com/browser/django/trunk/django/contrib/admin/options.py#L936),以便它可以獲取並使用一個對象作爲「初始」。你也可以重寫'get_form'並創建一個內置正確的'instance'的表單類,它會更幹,但也更復雜的代碼。 – ilvar 2012-04-19 15:24:54
這非常有幫助! – abidibo 2016-02-03 13:57:17