Начальное заполнение форм 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 />

и т.д.

Я рекомендую попробовать и немного экспериментировать. Затем задайте вопрос, если вы столкнулись с проблемой.

Ответ 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