我想为我的模型中的单个字段创建一个编辑表单,其中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参数指定要在对象中更新哪个字段吗?
答案 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主类中使用它们作为参考
您可以更轻松地检索对象类型并填充正确的