Django динамически получает доступ к значению поля по ключевому слову для передачи в шаблон - PullRequest
0 голосов
/ 30 июня 2011

Я хочу создать форму редактирования для одного поля в моей модели, где текстовая область предварительно заполнена текущим значением для этого поля.Однако точное имя поля не является аппаратным, и я хочу, чтобы оно было указано в URL.

Моя модель называется Topic.Два примера поля: Примечания и Цели.Я могу передать значение поля следующим образом:

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/, то оба из них заранее заполнили бы форму объективным значением, а не значением примечаний.

Могу ли я использовать URL-аргумент whichcolumn, чтобы указать, какое поле нужно обновить в объекте?

Ответы [ 2 ]

1 голос
/ 30 июня 2011

Вы можете использовать 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. Вам следует либо проверить значение какого столбца, прежде чем делать что-либо еще с этими данными, либо ограничить возможности в urlconf более конкретным регулярным выражением, например:

(r'^/(?P<topicshortname>\d+)/(?P<whichcolumn>(Notes|Objectives))/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'}),

Еще одна вещь, о которой вы должны знать, это то, что вы дважды обращались к базе данных, дважды вызывая Topic.objects.get (...). Вы должны повторно использовать значение thetopic.

0 голосов
/ 30 июня 2011

Вы должны разделить две концепции Заметок и Целей на два разных класса, а затем использовать их в своем основном классе Темы в качестве ссылки

. Было бы проще получить тип объекта и заполнить правильный.

...