可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I decided to learn Django Forms. For a while now, I have been using HTML forms because it's hard for me to come to terms with Django Forms.
How could I populate initial data to Django Forms?
Example:
Consider if these models are populated. Contain data.
models.py
class Game(models.Model):
title = models.CharField()
genre = models.CharField()
so if I have
view.py
game_list = Game.objects.all()
return render_to_response('template',locals())
so in template.html, I could just:
{% for game in game_list %}
<p> game.title <p> <br /> <p> game.genre <p>
If I want to populate initial data when using HTML forms, this is what I usually do:
{% 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" />
How can I do this in Django Forms?
From what I've seen by reading articles online, they do this by overriding using forms.__init__
:
class Anyforms(forms.Form):
super(Anyforms, self).__init__(*args,**kwargs)
I can't get a hold of how to populate using super
. What data do forms get during runtime and how?
Any good links that I could read to get me up and running on wrangling Django Forms?
Is this
<input="text" name="title" value="{{game.title}}" />
<input="text" name="genre" value="{{game.genre}}" />
equivalent to this?
data = {'title':'{{game.title}}','genre':'{{game.genre}}'}
form(data)
Are the variables going to be replaced in template?
回答1:
S. Lott's answer tells you how to initialize the form with some data in your view. To render your form in a template, see the following section of the django docs which contain a number of examples:
Although the examples show the rendering working from a python interpreter, it's the same thing when performed in a template.
For example, instead of print f
, your template would simply contain: {{ f }}
assuming you pass your form through the context as f
. Similarly, f.as_p()
is written in the template as {{ f.as_p }}
. This is described in the django template docs under the Variables section.
Update (responding to the comments)
Not exactly, the template notation is only for template. Your form and associated data are initialized in the view.
So, using your example, your view would contain something like:
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})
Then your template would have something like:
{{ form }}
Or if you wanted to customize the HTML yourself:
{{ form.title }} <br />
{{ form.genre }} <br />
and so on.
I recommend trying it and experimenting a little. Then ask a question if you encounter a problem.
回答2:
http://docs.djangoproject.com/en/1.2/ref/forms/api/#ref-forms-api-bound-unbound
To bind data to a form, pass the data as a dictionary as the first parameter to your Form class constructor:
>>> data = {'subject': 'hello',
... 'message': 'Hi there',
... 'sender': 'foo@example.com',
... 'cc_myself': True}
>>> f = ContactForm(data)
回答3:
just change
data = {'title':'{{game.title}}','genre':'{{game.genre}}'}
form(data)
to
data = {'title':'{{game.title}}','genre':'{{game.genre}}'}
form(initial=data)
回答4:
When using CBVs, you can override get_initial()
to populate initial data into the form. Example:
def get_initial(self):
initial = super(MyView, self).get_initial()
initial['start_date'] = datetime.date.today()
return initial
回答5:
Do you could try the follow:
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})
works fine for me on Django 1.8
回答6:
I think this will work too, but not sure.
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})
And in the view you can do like form.field to show form with intial data.
回答7:
You can pass the instance directly if you set the model attribute on the form class
class GameForm(forms.Form):
class Meta:
model = Game
In your view:
def view(request):
game = Game.objects.get(id=1)
form = GameForm(instance=game)
return render(request, 'template.html', {'form': form})
Works for me on django 2.1