python - 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
解决方案
我想到了!
您不能直接在 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
希望对将来的人有所帮助!:)
推荐阅读
- flutter - Flutter - StatefulWidget 和路由
- javascript - 当有人点击我想要播放声音时
- mysql - 是否可以将经典数据库与一个视图列混合?
- angular - Angular mat-drawer-container cdkScrollable 退订问题
- sql - 从 PostgreSQL 获取数据的正确方法是什么?
- javascript - 香草javascript轮播不滑动
- c# - 使用 Powershell 关闭 IE 中的活动选项卡
- java - 使用正确参数查找对象的代码出错
- python-3.x - 从 STRING 的 LIST 中提取数字并根据它们的标签将它们分配给另一个列表
- django - 如何反映用于从名称中的对象创建实例的变量?