Django通过关键字参数动态访问字段的值以传递给模板

时间:2011-06-30 12:48:41

标签: django django-views field

我想为我的模型中的单个字段创建一个编辑表单,其中textarea预先填充了该字段的当前值。但是,确切的字段名称不是硬连线,我希望它由URL指定。

我的模型叫做Topic。两个示例字段是Notes和Objectives。我可以硬连接字段值,如下所示:

urls.py

(r'^/(?P<topicshortname>\d+)/(?P<whichcolumn>[^/]+)/edit/$', 'mysyte.myapp.views.edit_topic_text'),

views.py

def edit_topic_text(topicshortname, whichcolumn):
    thetopic = Topic.objects.get(topic__shortname__iexact = topicshortname)
    content =  Topic.objects.get(topic__shortname__iexact = topicshortname).objective
    return render_to_response('topic_text_edit.html', locals())

topic_text_edit.html

<form method="post" action="../save/">
    <textarea name="content" rows="20" cols="60">{{ content }}</textarea>
    <br>
    <input type="submit" value="Save"/>
</form>

我也可以使用{{ thetopic.objective }}在模板中进行硬连线,但是如果我访问了http://mysite.com/topic/Notes/edit/,这两种情况都会预先填充表格中的目标值,而不是注释值。

我可以使用'whichcolumn'url参数指定要在对象中更新哪个字段吗?

2 个答案:

答案 0 :(得分:1)

您可以使用getattr按名称获取属性的值。以你的例子:

def edit_topic_text(topicshortname, whichcolumn):
    thetopic = Topic.objects.get(topic__shortname__iexact = topicshortname)
    content =  getattr(thetopic, whichcolumn)
    return render_to_response('topic_text_edit.html', locals())

但是,您应该也了解此的安全隐患。用户可以通过更改URL来编辑他们喜欢的模型上的任何字段。 您应该在对该数据执行任何其他操作之前检查whichcolumn的值,或者使用更具体的正则表达式限制urlconf中的可能性,例如:

(r'^/(?P<topicshortname>\d+)/(?P<whichcolumn>(Notes|Objectives))/edit/$', 'mysyte.myapp.views.edit_topic_text'),

您还提到字段'Notes'和'Objectives',但访问字段'objective',因此您可能需要将whichcolumn的值映射到您感兴趣的字段名称,例如:

(r'^/(?P<topicshortname>\d+)/Objectives/edit/$', 'mysyte.myapp.views.edit_topic_text', {'whichcolumn': 'objective'}),
(r'^/(?P<topicshortname>\d+)/Notes/edit/$', 'mysyte.myapp.views.edit_topic_text', {'whichcolumn': 'note'}),

您应该注意的另一件事是您通过两次调用Topic.objects.get(...)来访问数据库两次。你应该重用thetop的值。

答案 1 :(得分:0)

你应该在两个不同的类中分离Notes和Objectives的两个概念,然后在你的Topic主类中使用它们作为参考

您可以更轻松地检索对象类型并填充正确的