【问题标题】:Django clone model object with class based createview具有基于类的 createview 的 Django 克隆模型对象
【发布时间】:2016-04-08 09:13:51
【问题描述】:

我想准备一个新对象但等待用户输入来创建它:

我已将get_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_valid方法并没有执行,也没有创建新的对象。

【问题讨论】:

  • if form.is_valid(): form = form.save(); context = { "form": form, } ; return render(request, "app/template.html", context)
  • 是基于类的视图还是普通视图?如果它不是基于类的视图,那么super(MyCreateManView, self).form_valid(form) 没有多大意义。您是否从其他地方获得此代码并零碎复制?

标签: django django-views clone


【解决方案1】:

当你这样做时,

form  =  MyForm(instance = new_item)

您没有将表单绑定到任何数据。这意味着表单永远不会有效。

我会尝试覆盖 get_form_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

【讨论】:

    【解决方案2】:

    标记的答案不可能是正确的,因为我已经测试过了,它会覆盖你现有的对象!

    改为使用下面(在 Django 2.17 上测试)

    
        def get_form_kwargs(self):
            kwargs = super().get_form_kwargs()
    
            old_item = get_object_or_404(Tutorial, pk=self.kwargs['pk'])
            new_item = deepcopy(old_item)
            new_item.id = None
            kwargs['instance'] = deepcopy(new_item)
    
            return kwargs
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-23
      相关资源
      最近更新 更多