当用户选择以下选项值时,它将成功POST。但是,我试图在用户单击“提交”而不选择任何内容时发送错误消息。如果不选择就“提交”,则会出现错误:MultiKeyValueDictKeyError:'venue'。我如何正确编码以使错误消息在用户提交但未选择时显示?感谢您的详尽反馈!
views.py
def add(request):
if not 'user_id' in request.session:
return redirect('/chrisgrafil')
if request.method!='POST':
messages.error(request, 'Please select the following options')
return redirect('/dashboard')
else:
Ticket.objects.create(venue=request.POST['venue'], quantity=request.POST['quantity'], loop=request.POST['loop'], purchaser=User.objects.get(id=request.session['user_id']))
return redirect ('/confirmation')
dashboard.html
<form action="/add" method="POST">
{% csrf_token %}
<div class="text-center">
{% if messages %}
{% for message in messages %}
<div class="alert alert-danger p-2 pb-3">
<a class="close font-weight-normal initialism" data-dismiss="alert" href="#"><samp>×</samp></a>
{{message}}
</div>
{% endfor %}
{% endif %}
<label><strong>Location of Venue:</strong></label>
<select class="form-control" name="venue">
<option value="" selected disabled>Please select</option>
<option value="San Bernardino">San Bernardino</option>
<option value="Los Angeles">Los Angeles</option>
<option value="Riverside">Riverside</option>
</select>
</form>
models.py
class User(models.Model):
first_name=models.CharField(max_length=100)
last_name=models.CharField(max_length=100)
email=models.CharField(max_length=100)
password=models.CharField(max_length=100)
created_at=models.DateTimeField(auto_now_add=True)
updated_at=models.DateTimeField(auto_now=True)
class Ticket(models.Model):
venue=models.CharField(max_length=100)
quantity=models.PositiveIntegerField()
price=models.DecimalField(default=25.00, max_digits=5, decimal_places=2, null=True, blank=True)
loop=models.CharField(max_length=100)
purchaser = models.ForeignKey(User, related_name="purchases", on_delete=models.PROTECT)
created_at=models.DateTimeField(auto_now_add=True)
updated_at=models.DateTimeField(auto_now=True)
答案 0 :(得分:0)
您应该只将required
属性添加到<select>
元素中。最好在前端处理前端问题。
示例:
<select class="form-control" name="venue" required>
...
</select>
此外,您似乎在错误地构造视图。我仍然会处理上面显示的错误,但为将来参考,您应该像这样构建视图:
def add(request):
if request.method == 'POST':
user_id = request.session.get('user_id', '')
if not user_id:
return redirect('/chrisgrafil')
purchaser = User.objects.get(id=user_id)
venue = request.POST.get('venue', '')
quantity = request.POST.get('quantity', '')
loop = request.POST.get('loop', '')
if not venue:
messages.error(request, 'Please select the following options')
return redirect('/dashboard')
Ticket.objects.create(venue=venue, quantity=quantity, loop=loop, purchaser=purchaser)
return redirect('/confirmation')