Django - 表单异常后页面未完全加载

时间:2016-12-21 14:28:46

标签: django exception-handling

在我的django项目中,我有一个显示事件详情的视图。在该视图中,有一个指向另一个视图的链接,该视图包含将人员注册到该事件的表单。

如果达到最大参与者数且有人仍尝试注册,我的视图会抛出异常。并从公式网站返回到事件站点。但是事件站点没有完全加载,我认为查询没有执行。

我不知道如何编写返回功能。

此外,我的异常中是否存在语法错误?当我在shell中创建新的注册实例时,我可以保存尽可能多的注册实例。

def validate_category_full(category_id):
    cat = Category.objects.get(id=category_id)
    regs = cat.registration_set.all()
    if len(regs) >= cat.max_people:
        raise ValidationError('Category is already full.')

def registration(request, category_id, event_id):
    """Add a new registration to a category."""
    cat = Category.objects.get(id=category_id)
    myevent = Event.objects.get(id=event_id)

    if request.method != 'POST':
        form = RegistrationForm()
    else:
        form = RegistrationForm(request.POST)
        try:
            validate_category_full(cat.id)
        except(ValidationError):
            return render(request, 'events/event.html', 
                {'myevent': myevent,
                'error_message': 'Event is full.',})
        else:
            if form.is_valid():
                reg = form.save()
                return HttpResponseRedirect(reverse('events:category',
                                                args=(cat.id,)))

    context = {'form': form, 'cat': cat, 'myevent': myevent}
    return render(request, 'events/registration.html', context)`

1 个答案:

答案 0 :(得分:0)

由于我不知道你所说的“事件网站未满载”(并且假设“event-site”和“formular-site”真正意味着“事件页面”和“公式”页“):

首先:您不应该从另一个视图渲染模板,而是重定向到该视图。如果要将用户重定向回到另一个视图时向用户显示消息(在这种情况下为“事件已满”消息),请使用messages framework

来自django.contrib导入消息

def注册(request,category_id,event_id):     #剪掉很多代码

    try:
        validate_category_full(cat.id)
    except(ValidationError):
        messages.error(request, 'Event is full.') 
        return redirect(your_event_view_name, whatever_args_it_takes)

注意我们为什么会这样做:

=>使用queryset.count()代替len(queryset.all())

def validate_category_full(category_id):
    cat = Category.objects.get(id=category_id)
    regs = cat.registration_set.count()
    if regs >= cat.max_people:
        raise ValidationError('Category is already full.')

此外,由于您已经拥有该类别,因此您可能希望将其传递而不是category.id