Django模型表单标签不起作用

时间:2016-05-10 09:40:09

标签: python html django forms web

我在django 1.9中使用了一个模型表单,但是在widget中没有生成标签标记。不知道为什么会出现问题。

关于预付款,

这是py文件:

model.py:

class Account(models.Model):
     pseudo = models.CharField(_('pseudo'), max_length=100)
     password = models.CharField(_('password'), max_length=42)
     email = models.EmailField(_('email'), null=True)
     def __str__(self):
         return self.pseudo

form.py:

class AccountForm(forms.ModelForm):
    class Meta:
        model = Account
        fields = ('pseudo', 'password', 'email')
        labels = {
            'pseudo': _('Pseudo'),
            'password': _('Password'),
            'email': _('Email'),
        }
        widgets = {
            'pseudo': forms.TextInput(attrs={
                'class': 'form-control',
            }),
            'password': forms.PasswordInput(attrs={
                'class': 'form-control',
            }),
            'email': forms.EmailInput(attrs={
                'class': 'form-control',
            }),
        }

view.py:

def signup(request):
    AccountFormSet = AccountForm()
    if request.method == 'POST':
        if AccountFormSet.is_valid():
            AccountFormSet.save()
    return render(request, 'account/signup.html', {'formset': AccountFormSet})

signup.html:

{% for form in formset %}
   <div class="row">
      <div class="form-group">
        {{ form }}
      </div>
   </div>
{% endfor %}

输出是:

<input class="form-control" id="id_pseudo" maxlength="100" name="pseudo" type="text">
<input class="form-control" id="id_password" maxlength="42" name="password" type="password">
<input class="form-control" id="id_email" maxlength="254" name="email" type="email">

2 个答案:

答案 0 :(得分:3)

您的变量名称令人困惑。您可以参考formset,但不是在任何地方使用formset。我建议改变观点如下:

def signup(request):
    form = AccountForm()
    if request.method == 'POST':
        if form.is_valid():
            form.save()
    return render(request, 'account/signup.html', {'form': form})

然后在你的模板中,你循环遍历表单的字段,所以也要在那里更改变量。

如果要包含label标签,则需要明确包含{{ field.label_tag }}。包含{{ field.errors }}也是一个好主意。例如:

{% for field in form %}
  <div class="row">
    <div class="form-group">
      {{ field.errors }}
      {{ field.label_tag }}
      {{ field }}
    </div>
  </div>
{% endfor %}

有关详细信息,请参阅rendering fields manually上的文档。

答案 1 :(得分:1)

虽然你已经将变量称为form_set,但它实际上并不是一个formset,它仍然只是你的单一形式。

AccountFormSet = AccountForm()

因此,您不会迭代一组表单,表单的迭代器将迭代字段。因此要么包含标签,要么只删除for循环

{% for field in formset %}
   <div class="row">
      <div class="form-group">
        {{ field.label_tag }}
        {{ field }}
      </div>
   </div>
{% endfor %}
   <div class="row">
      <div class="form-group">
          <form>{{ form }}</form>
      </div>
   </div>