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

时间:2011-02-07 18:13:16

标签: javascript django django-admin django-templates

在我的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 Admin界面是否支持这样做? Django管理表单使用POST,但我不确定如何将POST数据添加到模板的请求中。

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

1 个答案:

答案 0 :(得分:13)

根据源代码(和快速测试),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,这将使is_active字段填充为True(因为任何非空字符串都是真值)。因此,如果您要“取消选中”给定字段的复选框,则根本不传递任何值,例如admin/foo/bar/add/?is_active=


这是add_viewModelAdmin方法的代码片段,负责将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)