Django访问字段';根据要传递给模板的关键字参数动态设置s值

Django访问字段';根据要传递给模板的关键字参数动态设置s值,django,django-views,field,Django,Django Views,Field,我想为我的模型中的单个字段创建一个编辑表单,其中textarea预先填充该字段的当前值。但是,确切的字段名不是硬连接的,我希望它由url指定 我的模型叫做Topic。两个示例字段是注释和目标。我可以如下所示硬连线字段值: url.py (r'^/(?P<topicshortname>\d+)/(?P<whichcolumn>[^/]+)/edit/$', 'mysyte.myapp.views.edit_topic_text'), topic\u text\u edit

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

我的模型叫做Topic。两个示例字段是注释和目标。我可以如下所示硬连线字段值:

url.py

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

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

{{content}}

我也可以使用
{{thetopic.objective}}
在模板中进行硬连接,但是如果我访问了这两个模板,则会使用目标值而不是notes值预填充表单


我可以使用“whichcolumn”url参数指定要在对象中更新的字段吗?

您应该在两个不同的类中分离注释和目标的两个概念,然后在主题主类中使用它们作为参考

检索对象类型并填充正确的对象类型会更容易,您可以使用该类型按名称获取属性值。例如:

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'),
(r'^/(?P\d+)/(?P(注释|目标))/edit/$,'mysyte.myapp.views.edit_topic_text'),
您还提到了字段“备注”和“目标”,但正在访问字段“目标”,因此您可能需要将其列的值映射到您感兴趣的字段名称,例如:

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

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

这对于预填充textarea很有效。非常感谢。我读过并试图伪造getattr(),但没有找到正确的语法。不幸的是,我的保存url仍然无法工作-我正在努力将getattr()放入保存函数中,因为它仍然是硬连接的
thetopic.objective=content
。谢谢你的安全建议,我会实现的。评论还提到了访问数据库两次的问题,谢谢“目标”(复数)是我文章中的一个输入错误。更新:使用
setattr(对象、字段、值)
,多亏了
(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'}),