在Django Forms上初始填充

die*_*ell 25 django django-forms

我决定学习Django Forms.有一段时间了,我一直在使用HTML表单,因为我很难与Django Forms达成协议.

我怎么能将初始数据填充到Django Forms?例:

考虑是否填充了这些模型.包含数据.

models.py

class Game(models.Model):
   title = models.CharField()
   genre = models.CharField()
Run Code Online (Sandbox Code Playgroud)

所以,如果我有

view.py

game_list = Game.objects.all()
return render_to_response('template',locals())
Run Code Online (Sandbox Code Playgroud)

所以在template.html中,我可以:

{% for game in game_list %}
<p> game.title <p> <br /> <p> game.genre <p>
Run Code Online (Sandbox Code Playgroud)

如果我想在使用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" />
Run Code Online (Sandbox Code Playgroud)

我怎么能在Django Forms中这样做?从我通过在线阅读文章看到的,他们通过覆盖使用forms.__init__:

class Anyforms(forms.Form):
   super(Anyforms, self).__init__(*args,**kwargs)
Run Code Online (Sandbox Code Playgroud)

我无法掌握如何填充使用super.表单在运行时获取的数据是什么?我可以阅读的任何好的链接让我和Django Forms争吵吗?

这是

<input="text" name="title" value="{{game.title}}" /> 
<input="text" name="genre" value="{{game.genre}}" /> 
Run Code Online (Sandbox Code Playgroud)

相当于这个?

data = {'title':'{{game.title}}','genre':'{{game.genre}}'} 
form(data) 
Run Code Online (Sandbox Code Playgroud)

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

ars*_*ars 25

S. Lott的回答告诉您如何使用视图中的某些数据初始化表单.要在模板中呈现表单,请参阅包含许多示例的django文档的以下部分:

虽然这些示例显示渲染是从python解释器开始工作的,但在模板中执行时也是如此.

例如,代替print f,您的模板将只包含:{{ f }}假设您通过上下文传递表单f.同样,f.as_p()在模板中写为{{ f.as_p }}.这在" 变量"部分下的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})
Run Code Online (Sandbox Code Playgroud)

然后你的模板会有类似的东西:

{{ form }}
Run Code Online (Sandbox Code Playgroud)

或者,如果您想自己自定义HTML:

{{ form.title }} <br />
{{ form.genre }} <br />
Run Code Online (Sandbox Code Playgroud)

等等.

我建议尝试一下并试验一下.如果遇到问题,请问一个问题.


S.L*_*ott 9

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)
Run Code Online (Sandbox Code Playgroud)

  • 如果数据无效,则会显示用户错误:(但是如果您将数据作为`initial`kwarg传递,它将填充字段而没有错误`f = ContactForm(initial = data)` (5认同)

Fre*_*usa 8

您可以尝试以下操作吗:

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})
Run Code Online (Sandbox Code Playgroud)

在 Django 1.8 上对我来说很好用


Sae*_*aeX 6

使用 CBV 时,您可以覆盖 FormMixinget_initial()以将初始数据填充到表单中。

例子:

class MyView(FormView):

    def get_initial(self):
        initial = super(MyView, self).get_initial()
        initial['start_date'] = datetime.date.today()
        return initial
Run Code Online (Sandbox Code Playgroud)

请参阅文档