我决定学习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)
变量是否会在模板中被替换?
答案 0 :(得分:20)
S上。 Lott的回答告诉您如何使用视图中的一些数据初始化表单。要在模板中呈现表单,请参阅包含许多示例的django文档的以下部分:
虽然这些示例显示渲染是从python解释器开始工作的,但在模板中执行时却是一样的。
例如,代替print f
,您的模板只会包含:{{ f }}
,假设您将表单作为f
传递给上下文。同样,f.as_p()
在模板中写为{{ f.as_p }}
。这在Variables部分下的django模板文档中进行了描述。
更新(回复评论)
不完全是,模板表示法仅适用于模板。您的表单和相关数据在视图中初始化。
因此,使用您的示例,您的视图将包含以下内容:
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 />
等等。
我建议尝试一下并尝试一下。如果遇到问题,请问一个问题。
答案 1 :(得分:8)
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)
答案 2 :(得分:3)
只需更改
data = {'title':'{{game.title}}','genre':'{{game.genre}}'}
form(data)
到
data = {'title':'{{game.title}}','genre':'{{game.genre}}'}
form(initial=data)
答案 3 :(得分:2)
使用CBV时,您可以覆盖def get_initial(self):
initial = super(MyView, self).get_initial()
initial['start_date'] = datetime.date.today()
return initial
以将初始数据填充到表单中。例如:
url = r'sybase+pyodbc://usename:password@dns'
engine = create_engine(url, echo=True)
Session = sessionmaker(bind=engine)
sess = Session()
conn = sess.connection()
答案 4 :(得分:2)
您可以尝试以下方式:
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上适合我。
答案 5 :(得分:0)
我认为这也会奏效,但不确定。
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 :(得分:0)
如果您在表单类上设置了模型属性,则可以直接传递实例
class CustomAuthForm(AuthenticationForm):
username = forms.CharField(widget=TextInput(attrs={'class': 'validate login-input-box', 'placeholder': 'Username'}))
password = forms.CharField(widget=PasswordInput(attrs={'class': 'login-input-box', 'placeholder': 'Password'}))
您认为:
path(r'^login/?$', auth_views.login, {'template_name': 'login.html', 'authentication_form': CustomAuthForm}),
在Django 2.1上为我工作