尽管从下拉列表中选择了某些内容,但仍显示 Django 表单错误消息
Django form error message showing despite selecting something from dropdown
我有一个 Django 模型是:
class Account(models.Model):
name = models.CharField(max_length=50, blank=True)
number = models.CharField(max_length=16, blank=True)
我想创建一个表单,用户可以在其中从下拉列表中 select 现有帐户的 phone 号码。所以在 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>
但是尽管 select 在提交之前从下拉列表(以及所有其他必需的表格)中输入了条目,我仍然在 HTML 页面上看到 phone_num_err_msgs
[please see the screenshot here].
有什么我想念的吗?我可以在哪里(哪个文件)导入 pdb
并查看它返回错误的原因?我是 Django 的新手,所以这很可能是一个愚蠢的 mistake/overlook。在此先感谢您的回答!
这里有一些错误。直接原因是您的 select 标记中缺少 name="phone_number "
,因此浏览器未发送该元素的任何数据。
但不清楚您为什么要手动构建该元素。您不应定义 CharField 并忽略它,而应使用 ModelChoiceField,它会自动为您提供一个包含所有帐户的 select 框。
class AccountSelectForm(forms.Form):
...
phone_number = forms. ModelChoiceField(queryset=Account.objects.all())
...
{{ form.phone_number.errors }}
{{ form.phone_number }}
我有一个 Django 模型是:
class Account(models.Model):
name = models.CharField(max_length=50, blank=True)
number = models.CharField(max_length=16, blank=True)
我想创建一个表单,用户可以在其中从下拉列表中 select 现有帐户的 phone 号码。所以在 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>
但是尽管 select 在提交之前从下拉列表(以及所有其他必需的表格)中输入了条目,我仍然在 HTML 页面上看到 phone_num_err_msgs
[please see the screenshot here].
有什么我想念的吗?我可以在哪里(哪个文件)导入 pdb
并查看它返回错误的原因?我是 Django 的新手,所以这很可能是一个愚蠢的 mistake/overlook。在此先感谢您的回答!
这里有一些错误。直接原因是您的 select 标记中缺少 name="phone_number "
,因此浏览器未发送该元素的任何数据。
但不清楚您为什么要手动构建该元素。您不应定义 CharField 并忽略它,而应使用 ModelChoiceField,它会自动为您提供一个包含所有帐户的 select 框。
class AccountSelectForm(forms.Form):
...
phone_number = forms. ModelChoiceField(queryset=Account.objects.all())
...
{{ form.phone_number.errors }}
{{ form.phone_number }}