Django:使用 POST 的选项值时不会出现消息错误
Django: Message error does not appear when using option value for POST
当用户选择以下选项值时--它成功发布。但是,当用户单击 "submit" 而不选择任何内容时,我试图发送一条错误消息。当它 "submits" 而没有选择时,它会报错: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)
您应该只将 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')
当用户选择以下选项值时--它成功发布。但是,当用户单击 "submit" 而不选择任何内容时,我试图发送一条错误消息。当它 "submits" 而没有选择时,它会报错: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)
您应该只将 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')