Django Admin:从 POST 或 GET 预填充值?

Posted

技术标签:

【中文标题】Django Admin:从 POST 或 GET 预填充值?【英文标题】:Django Admin: Pre-populating values from POST or GET? 【发布时间】:2011-06-22 22:17:26 【问题描述】:

在我的 Django 1.2.4 站点中,我想将用户引导到一个管理页面,该页面根据他们正在使用的当前数据预先填写了一些值。例如:

% for person in people %
    <tr>
        <td>person</td>
        <td><a href='admin/foo/bar/add?name=person'>Create a foo for person</td>
    </tr>
% endfor %

然后,当用户单击该链接时,name 字段将预先填充值 person

Django 管理界面是否支持这样做? Django 管理表单使用 POST,但我不确定如何将 POST 数据添加到来自模板的请求。

或者,我可以设置 GET 变量,然后在表单中使用自定义 javascript 来设置相应的值。

【问题讨论】:

【参考方案1】:

根据源代码(和一个快速测试),Django 确实支持在后台使用 GET 参数作为模型表单的初始值。它甚至支持多对多关系。

你试过了吗?也许是网址末尾缺少的斜线。

admin/foo/bar/add?name=Foobar

可能会被重定向到...

admin/foo/bar/add/

... 从而删除查询字符串。所以尝试在那里添加一个斜线,看看它是否有效。

admin/foo/bar/add/?name= person 

更新(预填充布尔字段)

以防其他人在预填充布尔字段时遇到问题:

如果您在查询字符串中传递任何值,例如admin/foo/bar/add/?is_active=foo,这将用 True 预填充 is_active 字段(因为任何非空字符串都是真值)。因此,如果您想“取消选中”给定字段的复选框,则根本不传递任何值,例如 admin/foo/bar/add/?is_active=


这是来自ModelAdmin 上的add_view 方法的代码的sn-p,负责使用GET 参数作为初始值。 http://code.djangoproject.com/browser/django/trunk/django/contrib/admin/options.py#L878

# Prepare the dict of initial data from the request.
# We have to special-case M2Ms as a list of comma-separated PKs.
initial = dict(request.GET.items())
for k in initial:
    try:
        f = opts.get_field(k)
    except models.FieldDoesNotExist:
        continue
    if isinstance(f, models.ManyToManyField):
        initial[k] = initial[k].split(",")

form = ModelForm(initial=initial)

【讨论】:

以上是关于Django Admin:从 POST 或 GET 预填充值?的主要内容,如果未能解决你的问题,请参考以下文章

django从零开始-视图

Django - 从 GET 更改为 POST 时出错

从 1.8 升级到 1.9 Django Admin get_urls 不起作用

Python Django之GET请求和POST请求及响应处理

Django 视图从应该发送 POST 的表单接收 GET 请求

3.Python Django之GET请求和POST请求及响应处理