【问题标题】:The view ProductCreateView didn't return an HttpResponse object. It returned None instead视图 ProductCreateView 没有返回 HttpResponse 对象。它返回 None 而不是
【发布时间】:2020-09-29 18:30:41
【问题描述】:

如何在通用FormView 内从def form_valid(self): 重定向到另一个页面。

我知道我应该做类似Super(className, self).form_valid(form): 的事情,但这永远不会重定向到动态链接,而只会转到success URL

这是我的代码:

class ProductCreateView(FormView):
    form_class = ProductCreateForm
    template_name = 'back_office/product_create_form.html'
    success_url = reverse_lazy('product_recipe_wrapper')

    def form_valid(self, form):
        category = Category.objects.get(id=self.kwargs['pk'])
        name = form.cleaned_data['name']
        image = form.cleaned_data['image']
        big_size = form.cleaned_data['big_size']
        mid_size = form.cleaned_data['mid_size']
        small_size = form.cleaned_data['small_size']
        new_product = Product.objects.create(category=category, name=name, image=image)
        big_size_object = ProductSize.objects.create(product=new_product, size=Size.objects.get(id=1),
                                                     sell_price=big_size)
        mid_size_object = ProductSize.objects.create(product=new_product, size=Size.objects.get(id=2),
                                                     sell_price=mid_size)
        small_size_object = ProductSize.objects.create(product=new_product, size=Size.objects.get(id=3),
                                                       sell_price=small_size)
        if small_size_object.sell_price != 0:
            return reverse_lazy('product_small_recipe', args=[small_size_object.id])

    def get_context_data(self, *args, **kwargs):
        context = super(ProductCreateView, self).get_context_data()
        context['category'] = Category.objects.get(id=self.kwargs['pk'])
        return context

【问题讨论】:

  • 如果您返回super().form_valid(form),那么您可以覆盖get_success_url 方法而不是success_url 并动态更改URL。但是在这种情况下,您使用的是small_size_object.id,因此在form_valid 方法中返回重定向可能更清晰。

标签: python django django-forms django-views django-generic-views


【解决方案1】:

form_valid 方法需要返回响应。错误消息 It returned None instead 表示该方法根本没有返回任何内容。在上面的代码中,当small_size_object.sell_price == 0: 时会发生这种情况。

接下来,你不能做return reverse_lazy(...),因为该方法需要返回一个响应,而不是一个URL。如果要重定向,可以使用HttpResponseRedirect,例如:

from django.http import HttpResponseRedirect

class ProductCreateView(FormView):
    ...

    def form_valid(self, form):
        ...
        return HttpResponseRedirect(reverse('product_small_recipe', args=[small_size_object.id]))

请注意,您可以在此处使用 reverse 而不是 reverse_lazy,因为您在方法中。

您可以使用redirect 快捷方式简化代码。

from django.shortcuts import redirect

class ProductCreateView(FormView):
    ...

    def form_valid(self, form):
        ...
        return redirect('product_small_recipe', small_size_object.id)

【讨论】:

    猜你喜欢
    • 2017-12-28
    • 1970-01-01
    • 2021-10-06
    • 2017-01-25
    • 2020-12-03
    • 2018-09-28
    • 2017-08-01
    • 2019-06-18
    相关资源
    最近更新 更多