在哪里覆盖Django CreateView?

时间:2019-05-26 22:20:38

标签: django django-models django-forms django-templates django-views

我在SO上公开了一个先前的问题,因为这里没有保存很多tomtomany字段。 Django CreateView With ManyToManyField在今天大部分时间进行故障排除后,我发现此代码实际上有效:

class CreateAuthorView(LoginRequiredMixin,CreateView):

    def form_valid(self, form):
        instance = form.save(commit=False)
        instance.save() 
        instance = form.save()

        if instance.access_level == "Custom":
            obj = NewAuthor.objects.get(secret=instance.name)
            obj.access.add(instance.created_by.id)
            print(instance.created_by.id)
            print(obj.access.all())
            instance = form.save()
            obj.save()
            form.save_m2m()
            instance = form.save()

        return super(CreateAuthorView, self).form_valid(form)

发布print(obj.access.all())时,我可以在控制台中看到

    obj.access.add(instance.created_by.id)

代码行实际上确实可以完成我想做的事情...它会将created_by.id添加到我在模型中定义的access(ManyToManyField)字段中。但是,当记录实际被剪切时,只会将用户在表单中选择的值添加到访问字段中,而且created_by.id永远不会将其添加到数据库中。

为了让created_by生效,我应该在其他地方重写CreateView吗?我似乎怀疑我在form_valid中的初始更新被覆盖。实际上,我已经证明了这一点,因为我的更新实际上在控制台中,但没有更新到数据库中。预先感谢您对如何最好地解决问题的任何想法。

1 个答案:

答案 0 :(得分:0)

我通过这个SO问题找到了问题的答案。事实证明,必须保存ModelForm中的SAVE才能保存M2M字段。 Save Many-To-Many Field Django Forms 这个很棘手。