Django使用基于类的createview克隆模型对象
我想准备一个新对象,但要等待用户输入来创建它: 我已将Django使用基于类的createview克隆模型对象,django,django-views,clone,Django,Django Views,Clone,我想准备一个新对象,但要等待用户输入来创建它: 我已将get\u form添加到此视图: class MyCreateView(CreateView): def get_form(self, form_class): form = super(MyCreateManView, self).get_form(form_class) if self.kwargs['ref']: new_item = get_object_or_404
get\u form
添加到此视图:
class MyCreateView(CreateView):
def get_form(self, form_class):
form = super(MyCreateManView, self).get_form(form_class)
if self.kwargs['ref']:
new_item = get_object_or_404(models.MyModel, pk = self.kwargs['ref'])
new_item.pk = None
new_item.note = "Copia di " + new_item.note
form = MyForm(instance = new_item)
def form_valid(self, form):
...
在该方法中,我读取GET参数'ref'并使用该数据预编译表单字段
但是当我提交数据时,不会执行form\u valid
方法,也不会创建新对象
form = MyForm(instance = new_item)
您没有将表单绑定到任何数据。这意味着该表单将永远无效
我会尝试覆盖get\u form\u kwargs
def get_form_kwargs(self):
kwargs = super(MyCreateView, self).get_form_kwargs()
if self.kwargs['ref']:
new_item = get_object_or_404(models.MyModel, pk = self.kwargs['ref'])
...
kwargs['instance'] = new_item
return kwargs
标记的答案不可能是正确的,因为我测试了它,它将覆盖您现有的对象 改为使用以下内容(在Django 2.17上测试)
def get_form_kwargs(自我):
kwargs=super()
旧项目=获取对象或404(教程,pk=self.kwargs['pk'])
新项目=深度复制(旧项目)
new_item.id=无
kwargs['instance']=深度复制(新项目)
返回kwargs
如果form.is_有效():form=form.save();上下文={“形式”:形式,};返回呈现(请求“app/template.html”,上下文)
它是基于类的视图还是普通视图?如果它不是基于类的视图,那么super(MyCreateManView,self)。form\u valid(form)
没有多大意义。你有没有从别的地方得到这段代码,然后零零碎碎地复制?