在 Django 的管理员中,我看到了如何使用 GET 变量设置“添加对象”表单的字段(例如/admin/app/model/add?title=lol
,将“标题”字段设置为“大声笑”)。
但是,我希望能够做一些事情,/admin/app/model/add?key=18
并从另一个模型的实例中为我的字段加载默认数据。理想情况下,我还希望能够对填充表单的值进行一些处理。我该怎么做呢?
在 Django 的管理员中,我看到了如何使用 GET 变量设置“添加对象”表单的字段(例如/admin/app/model/add?title=lol
,将“标题”字段设置为“大声笑”)。
但是,我希望能够做一些事情,/admin/app/model/add?key=18
并从另一个模型的实例中为我的字段加载默认数据。理想情况下,我还希望能够对填充表单的值进行一些处理。我该怎么做呢?
我设法弄清楚了。值得庆幸的是,Django 允许您替换 arequest
的GET
dict(它用于预填充管理表单)。以下对我有用:
class ArticleAdmin(admin.ModelAdmin):
# ...
def add_view(self, request, form_url='', extra_context=None):
source_id = request.GET.get('source', None)
if source_id is not 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 参数source
中获取对象,对它们做我想做的事,然后预填充表单。
您可以覆盖实例的方法add_view
。ModelAdmin
添加在此处获取对象,将对象设置pk
为None
并将该对象作为instance
表单提供。带有的对象pk == None
将始终作为新对象插入到表单的数据库中save()