首页 > 解决方案 > Django CreateView - 如果字段为空,则不要创建对象,而是重定向到不同的视图。我该怎么做呢?

问题描述

我有一个媒体模型和一个产品模型。当用户创建产品时,他们首先上传图片,然后在此之后,他们被转发到产品详细信息页面,他们可以在其中编辑产品属性。这很好用,但是如果用户不上传图片,我希望程序跳过创建媒体对象,直接进入产品详细信息页面。

我尝试从 form_valid() 返回一个 reverse() 函数,但这不起作用,所以我想知道是否有人知道这是为什么以及如何解决这个问题?

我的代码目前:

class ProductMediaCreate(generic.CreateView):

    model = ProductMedia
    fields = ('media',)
    template_name = 'media/media_create.html'

    def form_valid(self, form):
        product_obj = Product.objects.create()
        
        if not form.instance.media:
            return reverse('product_detail', kwargs={'pk': product_obj.pk})

        form.instance.product = product_obj
        return super().form_valid(form)

    def get_success_url(self):
        return reverse('product_detail', kwargs={'pk': self.product.pk})

但是,这会产生错误:'str' object has no attribute 'get'当我在 CreateView 上提交没有图片的表单时。

编辑:不确定这是否会有所帮助,但是按照错误的回溯状态,错误的来源在该行的 clickjacking.py 内:(if response.get('X-Frame-Options') is not None: 我不确定这意味着什么)

提前感谢您的帮助!

- GoingRoundInCircles

标签: pythondjangoredirectdjango-formsdjango-class-based-views

解决方案


我想到了!

您不能直接在 form_valid 中使用 reverse() ,因为 form_valid() 期待响应,因此您必须在 reverse 函数周围使用 HttpResponseRedirect() 。

IE

if not form.instance.media:
    return HttpResponseRedirect(reverse('product_detail', kwargs={'pk': product_obj.pk}))

要获取 HttpResponseRedirect,您可以从 django.http 导入它:

from django.http import HttpResponseRedirect

希望对将来的人有所帮助!:)


推荐阅读