基于 class 的 createview 的 Django 克隆模型对象
Django clone model object with class based createview
我想准备一个新对象,但要等待用户输入来创建它:
我已将 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
方法没有执行,也没有创建新对象
当你这样做时,
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
我测试了标记的答案是不正确的,它会覆盖你现有的对象!
改用下面的方法(在 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
我想准备一个新对象,但要等待用户输入来创建它:
我已将 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
方法没有执行,也没有创建新对象
当你这样做时,
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
我测试了标记的答案是不正确的,它会覆盖你现有的对象!
改用下面的方法(在 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