在具有中间模型的m-t-m上使用基于类的UpdateView

时间:2012-07-13 09:00:30

标签: django django-models django-class-based-views

如何说服基于Django 1.3类的通用视图:

UpdateView.as_view(model=Category,
template_name='generic_form.html',
success_url='/category/')

不要轻易放弃错误:

"Cannot set values on a ManyToManyField which specifies an intermediary model."

即使中间模型中的所有字段都有默认值,我也无法获得基于类的通用视图来保存。基于功能的版本看起来也很混乱。 Django 1.3。

2 个答案:

答案 0 :(得分:1)

您应该扩展UpdateView并覆盖form_valid()方法以手动保存中间模型。

就个人而言,我从不直接从URL模式使用通用视图,我总是在views.py中逐字扩展。

答案 1 :(得分:1)

正如Berislav Lopac所说:

class CategoryView(UpdateView):
    model=Category
    def form_valid(self, form):
        self.object = form.save(commit=False)
        IntermediateModel.objects.filter(category = self.object).delete()
        for other_side_model_object in form.cleaned_data['other_side_model_field']:
            intermediate_model = IntermediateModel()
            intermediate_model.category = self.object
            intermediate_model.other_side_model_related_field= other_side_model_object
            intermediate_model.save()
        return super(ModelFormMixin, self).form_valid(form)

我回答了一些类似的here