在Django Forms上初始填充

时间:2010-09-30 17:58:03

标签: django django-forms

我决定学习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) 

变量是否会在模板中被替换?

7 个答案:

答案 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上为我工作