Начальное заполнение форм Django
Я решил изучить Django Forms. Некоторое время я использую HTML-формы, потому что мне трудно смириться с Django Forms.
Как я могу заполнить начальные данные Django Forms?
Пример:
Рассмотрим, заполнены ли эти модели. Содержит данные.
models.py
class Game(models.Model):
title = models.CharField()
genre = models.CharField()
поэтому, если у меня есть
view.py
game_list = Game.objects.all()
return render_to_response('template',locals())
поэтому в template.html я мог бы просто:
{% for game in game_list %}
<p> game.title <p> <br /> <p> game.genre <p>
Если я хочу заполнять исходные данные при использовании HTML-форм, это то, что я обычно делаю:
{% for game in game_list %}
<form action= '/add/' method='POST'>
<input="text" name="title" value="{{game.title}}" />
<input="text" name="genre" value="{{game.genre}}" />
<input type="submit" />
Как это сделать в Django Forms?
Из того, что я видел, читая статьи в Интернете, они делают это, переопределяя с помощью forms.__init__
:
class Anyforms(forms.Form):
super(Anyforms, self).__init__(*args,**kwargs)
Я не могу понять, как заполнить, используя super
. Какие данные формируются во время выполнения и как?
Какие-нибудь хорошие ссылки, которые я мог бы прочитать, чтобы поднять меня и начать спорить с Django Forms?
Это
<input="text" name="title" value="{{game.title}}" />
<input="text" name="genre" value="{{game.genre}}" />
эквивалентно этому?
data = {'title':'{{game.title}}','genre':'{{game.genre}}'}
form(data)
Заменяются ли переменные в шаблоне?
Ответы
Ответ 1
S. Lott отвечает, как инициализировать форму с некоторыми данными в вашем представлении. Чтобы отобразить форму в шаблоне, см. Следующий раздел django docs, который содержит несколько примеров:
Хотя примеры показывают рендеринг, работающий от интерпретатора python, это то же самое, когда выполняется в шаблоне.
Например, вместо print f
ваш шаблон просто будет содержать: {{ f }}
, предполагая, что вы передаете свою форму через контекст как f
. Аналогично, f.as_p()
записывается в шаблоне как {{ f.as_p }}
. Это описано в документах django template в разделе Variables.
Обновление (ответ на комментарии)
Не совсем, нотация шаблона предназначена только для шаблона. Форма и связанные с ней данные инициализируются в представлении.
Итак, используя ваш пример, ваше представление будет содержать что-то вроде:
def view(request):
game = Game.objects.get(id=1) # just an example
data = {'id': game.id, 'position': game.position}
form = UserQueueForm(initial=data)
return render_to_response('my_template.html', {'form': form})
Тогда ваш шаблон будет иметь что-то вроде:
{{ form }}
Или, если вы хотите сами настроить HTML-код:
{{ form.title }} <br />
{{ form.genre }} <br />
и т.д.
Я рекомендую попробовать и немного экспериментировать. Затем задайте вопрос, если вы столкнулись с проблемой.
Ответ 2
http://docs.djangoproject.com/en/1.2/ref/forms/api/#ref-forms-api-bound-unbound
Чтобы привязать данные к форме, передайте данные в качестве словаря в качестве первого параметра в свой конструктор класса Form:
>>> data = {'subject': 'hello',
... 'message': 'Hi there',
... 'sender': '[email protected]',
... 'cc_myself': True}
>>> f = ContactForm(data)
Ответ 3
просто измените
data = {'title':'{{game.title}}','genre':'{{game.genre}}'}
form(data)
к
data = {'title':'{{game.title}}','genre':'{{game.genre}}'}
form(initial=data)
Ответ 4
При использовании CBV вы можете переопределить get_initial()
, чтобы заполнить исходные данные в форме. Пример:
def get_initial(self):
initial = super(MyView, self).get_initial()
initial['start_date'] = datetime.date.today()
return initial
Ответ 5
Я думаю, что это тоже сработает, но не уверен.
def view(request):
game = Game.objects.get(id=1) # just an example
form = UserQueueForm(instance=game)
return render_to_response('my_template.html', {'form': form})
И в представлении вы можете сделать, как form.field, чтобы показать форму с интуитивными данными.
Ответ 6
Вы можете попробовать следующее:
from django.forms.models import model_to_dict
def view(request):
game = Game.objects.get(id=1)
form = UserQueueForm(initial=model_to_dict(game))
return render_to_response('my_template.html', {'form': form})
отлично работает для меня на Django 1.8