Начальное заполнение форм Django - PullRequest
21 голосов
/ 30 сентября 2010

Я решил выучить формы Джанго.Некоторое время я использую формы HTML, потому что мне трудно примириться с формами Django.

Как можно заполнить исходные данные в формах Django?Пример:

Подумайте, заполнены ли эти модели.Содержит данные.

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.__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) 

переменные будут заменены в шаблоне?

Ответы [ 7 ]

20 голосов
/ 30 сентября 2010

S. Ответ Лотта говорит вам, как инициализировать форму с некоторыми данными в вашем представлении. Чтобы отобразить вашу форму в шаблоне, см. Следующий раздел документации django, которая содержит несколько примеров:

Хотя примеры показывают рендеринг, работающий с интерпретатором Python, это то же самое, когда выполняется в шаблоне.

Например, вместо print f ваш шаблон будет просто содержать: {{ f }}, если вы передадите форму через контекст как f. Аналогично, f.as_p() записывается в шаблоне как {{ f.as_p }}. Это описано в документации по шаблону django в разделе Переменные .

Обновление (отвечая на комментарии)

Не совсем, обозначение шаблона только для template . Ваша форма и связанные с ней данные инициализируются в представлении .

Итак, используя ваш пример, ваше представление будет содержать что-то вроде:

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 />

и так далее.

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

8 голосов
/ 30 сентября 2010

http://docs.djangoproject.com/en/1.2/ref/forms/api/#ref-forms-api-bound-unbound

Чтобы связать данные с формой, передайте данные в виде словаря в качестве первого параметра конструктору класса Form:

>>> data = {'subject': 'hello',
...         'message': 'Hi there',
...         'sender': 'foo@example.com',
...         'cc_myself': True}
>>> f = ContactForm(data)
3 голосов
/ 01 октября 2010

просто изменить

data = {'title':'{{game.title}}','genre':'{{game.genre}}'} 
form(data) 

на

data = {'title':'{{game.title}}','genre':'{{game.genre}}'} 
form(initial=data) 
2 голосов
/ 20 ноября 2015

Можете ли вы попробовать следующее:

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

2 голосов
/ 15 ноября 2015

При использовании CBV вы можете переопределить get_initial(), чтобы заполнить исходные данные в форме.Пример:

def get_initial(self):
    initial = super(MyView, self).get_initial()
    initial['start_date'] = datetime.date.today()
    return initial
0 голосов
/ 22 октября 2018

Вы можете передать экземпляр напрямую, если вы установите атрибут модели в классе формы

class GameForm(forms.Form):
    class Meta:
        model = Game

На ваш взгляд:

def view(request):
    game = Game.objects.get(id=1)
    form = GameForm(instance=game)
    return render(request, 'template.html', {'form': form})

у меня работает на django 2.1

0 голосов
/ 15 ноября 2015

Я думаю, это тоже будет работать, но не уверен.

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 для отображения формы с начальными данными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...