【问题标题】:Django form error message showing despite selecting something from dropdown尽管从下拉列表中选择了某些内容,但仍显示 Django 表单错误消息
【发布时间】:2015-07-08 15:33:04
【问题描述】:

我有一个 Django 模型:

class Account(models.Model):
    name = models.CharField(max_length=50, blank=True)
    number = models.CharField(max_length=16, blank=True)

我想创建一个表单,用户可以在其中从下拉列表中选择现有帐户的电话号码。所以在forms.py,我有:

class AccountSelectForm(forms.Form):
    phone_num_err_msgs = {'required': "You must select a phone number to send this message."}

    phone_number = forms.CharField(required=True, error_messages=phone_num_err_msgs)
    selected_group_ids = forms.CharField(required=True, widget=forms.HiddenInput)
    launch_datetime = forms.CharField(required=True)

views.py,我有:

class AccountSelectView(LoginRequiredMixin, FormView):
    template_name = 'campaigns/send.html'
    form_class = AccountSelectForm
    success_url = reverse_lazy('campaigns:taskq_list')

    def get_context_data(self, **kwargs):
        data = super(AccountSelectView, self).get_context_data(**kwargs)
        data['groups'] = Group.objects.all()
        data['campaign'] = Campaign.objects.get(id=self.request.GET['cam_id'])
        data['accounts'] = Account.objects.all()
        return data

    def form_valid(self, form):
        # If we insert pdb, we never reach here
        #import pdb
        #pdb.set_trace()

        data = form.cleaned_data
        campaign_id = self.request.GET['cam_id']
        # ... do other form validation stuff here
        return super(ConversationSendView, self).form_valid(form)

send.html,我有:

<form action="" method="post">
    {% csrf_token %}
    <!-- A couple of other fields to collect user input -->
    <div class="form-group">
        <p><b>Step 3: Select aphone number to send the message FROM:</b></p>
        {{ form.phone_number.errors }}
        <select id="phone" style="width: 380px;">
            <option value="">--------</option>
            {% for a in accounts %}
                <option value="{{ a.id }}">{{ a.number }}</option>
            {% endfor %}
        </select>
    <div class="page-btns">
        <input type="submit" class="btn btn-primary" value="Send Message to Selected Group(s)" />
    </div>
</form>

但是,尽管在提交之前从下拉列表中选择了条目(以及所有其他必需的表单),但我仍然在 HTML 页面 [please see the screenshot here] 上看到 phone_num_err_msgs

我有什么遗漏的吗?我可以在哪里(哪个文件)导入 pdb 并查看它为什么返回错误?我是 Django 新手,所以这很可能是一个愚蠢的错误/忽略。提前感谢您的回答!

【问题讨论】:

标签: django django-forms django-views


【解决方案1】:

这里有一些问题。直接原因是您的选择标记中缺少name="phone_number ",因此浏览器没有为该元素发送任何数据。

但尚不清楚您为什么要手动构建该元素。与其定义 CharField 并忽略它,不如使用 ModelChoiceField,它会自动为您提供一个包含所有帐户的选择框。

class AccountSelectForm(forms.Form):
    ...
    phone_number = forms. ModelChoiceField(queryset=Account.objects.all())

...

{{ form.phone_number.errors }}
{{ form.phone_number }}

【讨论】:

  • 谢谢!在我的选择标签中添加“名称”属性可以解决问题。 :) 我不熟悉 ModelChoiceField,但似乎是一种更清洁/更简单的方式来完成我想要做的事情。今晚回家后我会试一试。再次感谢您。
猜你喜欢
  • 2016-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-14
  • 2018-09-08
  • 1970-01-01
  • 2020-09-04
  • 2015-01-03
相关资源
最近更新 更多