【问题标题】:Django model form labels not workingDjango模型表单标签不起作用
【发布时间】:2016-09-05 04:53:45
【问题描述】:

我在 django 1.9 中使用模型表单,但在小部件是时不会生成标签标记。不知道为什么,但出了点问题。

关于预付款,

这是 py 文件:

模型.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">

【问题讨论】:

    标签: python html django forms web


    【解决方案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>
    

    【讨论】:

      【解决方案2】:

      您的变量名称令人困惑。您指的是表单集,但您没有在任何地方使用表单集。我建议按如下方式更改视图:

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

      然后,在您的模板中,您正在循环浏览表单的字段,因此也要更改那里的变量。

      如果要包含标签标签,则需要显式包含{{ 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 上的文档。

      【讨论】:

        猜你喜欢
        • 2017-02-19
        • 2016-02-24
        • 2011-04-28
        • 2016-03-22
        • 1970-01-01
        • 2012-08-23
        • 2019-06-24
        • 2016-01-29
        • 2021-02-15
        相关资源
        最近更新 更多