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

Django CreateView - if field is empty, don't create an object and instead redirect to different view. How do I do this?

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

我试过从 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

我想通了!

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

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

要获取 HttpResponseRedirect,请从 django.http:

导入它
from django.http import HttpResponseRedirect

希望对以后的人有所帮助! :)