Django:将选项值用于POST时不会出现消息错误

时间:2019-04-25 22:37:29

标签: django post select message

当用户选择以下选项值时,它将成功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)

1 个答案:

答案 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')