具有ManyToManyField的Django CreateView

时间:2019-05-25 22:53:19

标签: django django-models django-forms django-views many-to-many

我正在尝试使用Django CreateView并最终在用户选择某个值的情况下更新ManyToMany字段。我可以验证表单,但最终它不是更新数据库中的manytomanyfield。不知道我在做什么错。我已经提到过类似的Django ManyToMany CreateView Fields In Both Tables这样的SO问题,但这对我没有帮助。我最近找到了此链接... Django CreateView: How to perform action upon save,它似乎与我遇到的问题非常接近。预先感谢您的任何想法。

我的代码:

class AuthorView(LoginRequiredMixin,CreateView):
    model = NewAuthor
    form_class = NewAuthorForm
    template_name = 'create_author.html'

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

        if instance.status == 'Submitted':

            if instance.choice == "Custom":
                instance.access.add(instance.created_by)  
                form.save_m2m()

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

这是我的模特:

class NewAuthor(models.Model):

CHOICES = (
    ('',''),
    ("Default",Default ),
    ("Custom",Custom ),
)

STATUS_CHOICES = (
    ("Submitted","Submitted"),
    ("Pending","Pending")
)

status = models.CharField(choices=STATUS_CHOICES,default="Submitted",max_length=20)
choice = models.CharField(choices=CHOICES,blank=True,max_length=300)
created_by = models.ForeignKey(User,null=True,on_delete=models.DO_NOTHING,related_name='created_by_user')    
access = models.ManyToManyField(User,related_name="new_author_individual_access")

这将通过表单验证,但不会将created_by值保存在manytomany字段中。我试图合并form.save(commit = False)和后续的form.save(),但这似乎也无济于事。我最终尝试有条件地将created_by用户添加到manytomany字段中,但到目前为止还没有运气。

作为一个快速更新,如果我将form.save_m2m()添加到我的代码中,它实际上确实将created_by添加到了数据库中……但是我还得到一个错误,指出对象没有属性'save_m2m'。它实际上添加了created_by,但由于此错误而退出。现在,如果我添加commit = False,则没有错误,但是数据库也没有更新。

2 个答案:

答案 0 :(得分:0)

我认为您忘记设置了created_by的值,您将其保存为空值,因为它是模型中的默认值。尝试

    instance = form.save(commit=False)
    instance.created_by = request.user # or whatever value
    instance.save()

答案 1 :(得分:0)

这篇文章是我的问题的答案。 Save Many-To-Many Field Django Forms ModelForms很棒。...但是显然没有使用m2m ...真是筋疲力尽...