Django表单错误消息显示,尽管从下拉列表中选择了某些内容

Django表单错误消息显示,尽管从下拉列表中选择了某些内容,django,django-forms,django-views,Django,Django Forms,Django Views,我有一个Django模型,它是: class Account(models.Model): name = models.CharField(max_length=50, blank=True) number = models.CharField(max_length=16, blank=True) 我想创建一个表单,用户可以从下拉列表中选择现有帐户的电话号码。因此,在forms.py中,我有: 在views.py中,我有: 在send.html中,我有: 但是,尽管在提交之前从

我有一个Django模型,它是:

class Account(models.Model):
    name = models.CharField(max_length=50, blank=True)
    number = models.CharField(max_length=16, blank=True)
我想创建一个表单,用户可以从下拉列表中选择现有帐户的电话号码。因此,在forms.py中,我有:

在views.py中,我有:

在send.html中,我有:

但是,尽管在提交之前从下拉列表中选择了条目和所有其他必需的表单,我还是在HTML页面上看到了phone_num_err_msgs


有什么我遗漏的吗?在哪里可以导入pdb并查看其返回错误的原因?我是Django的新手,所以这很可能是一个愚蠢的错误/疏忽。提前感谢您的回答

这里有几件事不对。直接原因是select标记中缺少name=phone\ U number,因此浏览器未发送该元素的任何数据

但不清楚为什么要手动构造该元素。您不应该定义字符域并忽略它,而应该使用ModelChoiceField,它将自动为您提供一个包含所有帐户的选择框

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


从这个引用中,您的验证永远不会被调用,因此您可能应该重写clean_phone_numberself,并执行一些逻辑以确保提供的电话号码是有效的。顺便说一句,请注意,文档表明默认情况下表单字段是必填的。@sgmart,谢谢您的回复。我根据丹尼尔的建议找到了问题非常感谢。在“我的选择”标记中添加“名称”属性可以解决此问题:我不熟悉ModelChoiceField,但它似乎是一种更干净/更简单的方法来完成我试图做的事情。今晚一到家我就试试。再次非常感谢你。
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)
<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>
class AccountSelectForm(forms.Form):
    ...
    phone_number = forms. ModelChoiceField(queryset=Account.objects.all())
{{ form.phone_number.errors }}
{{ form.phone_number }}