基于类视图中的表单处理

时间:2015-10-29 09:21:10

标签: python django forms

表单无效时有问题(在POST方法中)。

  

没有返回HttpResponse对象。它改为返回None。

我可以将此行粘贴到Post方法的最后一行

return render(request, self.template_name, context)

但是在Get方法中初始化了上下文变量。如何将上下文传递给post方法?

class EventPage(View):
    template_name = 'event.html'

    def get(self, request, event_id):
        event = Event.objects.get(id = event_id)
        participants = Participant.objects.filter(event_id = event.id)
        register_to_event_form = RegisterToEvent()
        context = {
            'register_to_event_form': register_to_event_form,
            'title': event.title,
            'description': event.description,
        }
        return render(request, self.template_name, context)

    def post(self, request, event_id):
        event = Event.objects.get(id = event_id)
        if request.method == "POST":
            register_to_event_form = RegisterToEvent(request.POST)
            if register_to_event_form.is_valid():
                participant = register_to_event_form.save(commit=False)
                participant.event = event
                participant.save()
                return HttpResponseRedirect('/event-%s' %event_id)

3 个答案:

答案 0 :(得分:1)

你根本不应该这样做。基于类的视图的重点在于它们提供了一系列方法供您覆盖,这些方法由php:functionget的默认实现调用;你不应该真的超越自我发布。

在您的情况下,您应该使用CreateView,而不是普通视图。您应该使用post方法返回事件和参与者。设置保存对象的get_context_data属性应该在event方法中进行。

答案 1 :(得分:0)

我认为你需要一个else语句,如果是非有效的形式,它返回一个HttpResponseRedirect

答案 2 :(得分:0)

如果您的表单无效,则不会返回任何内容,因此您可以这样做:

 def post(self, request, event_id):
    event = Event.objects.get(id = event_id)
    register_to_event_form = RegisterToEvent(request.POST)
    if register_to_event_form.is_valid():
        . . .      
        return HttpResponseRedirect('/event-%s' %event_id)
    else:
        context = {'register_to_event_form': register_to_event_form}
        return render(request, self.template_name, context)

您在帖子方法中不需要if request.method == "POST":