【问题标题】:View Returned None instead of HttpResponse查看返回 None 而不是 HttpResponse
【发布时间】:2016-04-20 04:26:45
【问题描述】:

当我尝试使用 ajax 和基于类的视图发布表单时出现上述错误 这是模板

<form method="post" id="guestform">
                   {% csrf_token %}  
                    {% load i18n %}

                      <div id="div_id_username" class="form-group">
                        <div class="controls "> 
                          <input class="textinput form-control" id="id_email" maxlength="254" name="email" type="text" placeholder="Enter Email" /> 
                        </div> 
                      </div> 

                      <input class='btn btn-block btn-primary nextBtn' type="submit" value="Continue As Guest" onclick="ContinueAsGuest(event)" />
               </form>

这是脚本

<script type="text/javascript">
          function ContinueAsGuest(event) {
            var email = $("#id_email").val();
            $.ajax({        
                type: "POST",
                data : {action : 'guest' , email : email , csrfmiddlewaretoken: "{{ csrf_token }}"},
                url: "{% url 'checkout' %}",
                success: function(data) {
                  $("#loading-image").hide();

                },
                error: function(response, error) {
                    alert(error);  
                }
            });
    }
</script>

这是一个基于类的视图

class CheckoutView(CartOrderMixin , DetailView , FormView):
    model = Cart
    template_name = "orders/checkout_view.html"

    def get_object(self , *args , **kwargs):
        cart = self.get_cart()

        if cart == None:
            return None

        return cart 

    def get_context_data(self ,*args , **kwargs):
        context = super(CheckoutView , self).get_context_data(*args , **kwargs)
        user_can_continue = False

        user_checkout_id = self.request.session.get('user_checkout_id')

        if self.request.user.is_authenticated():
            user_checkout , created = UserCheckout.objects.get_or_create(email=self.request.user.email)
            user_checkout.user = self.request.user
            user_checkout.save()
            self.request.session['user_checkout_id'] = user_checkout.id
            context["client_token"] = user_checkout.get_client_token()

        if not self.request.user.is_authenticated() and user_checkout_id == None:
            context["login_form"] = AuthenticationForm()
            context["next_url"] =  self.request.build_absolute_uri()

        else:
            pass

        if user_checkout_id != None:
            user_can_continue = True
            if not self.request.user.is_authenticated():
                user_checkout_2 = UserCheckout.objects.get(id=user_checkout_id)
                context["client_token"] = user_checkout_2.get_client_token()

        context["user_can_continue"] = user_can_continue
        context["form"] = GuestCheckoutForm()
        return context

    def post(self , request , *args , **kwargs):
        self.object = self.get_object()
        action = request.POST.get('action')
        print action
        email = request.POST.get('email')
        print email
        user_checkout , created = UserCheckout.objects.get_or_create(email=email)
        print user_checkout
        self.request.session['user_checkout_id'] = user_checkout.id

        if created:
            user_checkout.save()

    def get_success_url(self):
        return reverse('checkout')

    def get(self , request , *args , **kwargs):
        get_data = super(CheckoutView , self).get(request , *args , **kwargs)
        cart = self.get_object()

        if cart == None:
            return HttpResponseRedirect(reverse('cart'))

        new_order = self.get_order()

        user_checkout_id = request.session.get('user_checkout_id')

        if user_checkout_id != None:
            user_checkout = UserCheckout.objects.get(id=user_checkout_id)

            address = self.request.session.get('address_id')

            if request.is_ajax():
                if request.GET.get('action') == 'address':
                    if new_order.address == None:
                        user_checkout_id = self.request.session.get('user_checkout_id')
                        user_checkout = UserCheckout.objects.get(id=user_checkout_id)
                        address = UserAddress.objects.filter(user = user_checkout)
                        print address
                        return HttpResponseRedirect(reverse('useraddress'))

                if request.GET.get('action') == 'order':
                    data = {}
                    data["order"] = self.get_order()
                    return render(request , "orders/new_order.html" , data)


            new_order.user = user_checkout
            new_order.save()

        return get_data

我在哪里出错了?我该如何解决上述错误。需要帮助。谢谢

【问题讨论】:

    标签: jquery ajax django django-templates django-views


    【解决方案1】:

    确保您的post() 返回HttpResponse

    from django.shortcuts import redirect
    
    def post(self , request , *args , **kwargs):
        self.object = self.get_object()
        action = request.POST.get('action')
        print action
        email = request.POST.get('email')
        print email
        user_checkout , created = UserCheckout.objects.get_or_create(email=email)
        print user_checkout
        self.request.session['user_checkout_id'] = user_checkout.id
    
        if created:
                user_checkout.save()
    
        return redirect(self.get_success_url())
    

    每个 Django 视图都必须是一个callable,它接收HttpRequest 以及可选参数,并返回一个HttpResponse 对象。 CBV 也不例外,因此他们的getpost 等视图必须返回响应。

    尽管恕我直言,您应该从 generic.FormView 继承 - 它处理的不仅仅是成功的 url 重定向。

    【讨论】:

    • 获取'super'对象没有属性'post'
    • 您有两个选择:要么从FormView 继承(我个人推荐的方式),要么手动做出响应。我将使用最后一个更新答案,以使您的代码正常工作而不会在其他地方发生故障。
    • 但是需要在这个视图中呈现多个表单。我猜表单视图只接受一个表单。
    • 是否有任何其他解决方案可以使用 FormVIew 呈现多个表单?
    • 为什么我已经有 get_success_url 需要重定向?
    猜你喜欢
    • 1970-01-01
    • 2019-10-13
    • 2019-06-12
    • 2016-08-08
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多