【问题标题】:Class Based Views (CBV), CreateView and request.user with a many-to-many relation基于类的视图 (CBV)、CreateView 和 request.user 具有多对多关系
【发布时间】:2018-03-04 20:16:19
【问题描述】:

基于https://docs.djangoproject.com/en/1.11/topics/class-based-views/generic-editing/#models-and-request-user 中的示例 - 但使用多对多关系而不是外键关系:

models.py

from django.contrib.auth.models import User
from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=200)
    owners = models.ManyToManyField(User, related_name='owners_')

views.py

from django.views.generic.edit import CreateView
from myapp.models import Author

class AuthorCreate(CreateView):
    model = Author
    fields = ['name']

    def form_valid(self, form):
        form.instance.owners = self.request.user
        return super(AuthorCreate, self).form_valid(form)

会输出

"<Author: test>" needs to have a value for field "id" before this many-to-many relationship can be used.

如何避免这种情况?

【问题讨论】:

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


    【解决方案1】:

    像这样编辑你的视图,

    class AuthorCreate(CreateView):
        model = Author
        fields = ['name']
    
        def form_valid(self, form):
            self.object = form.save()
            self.object.owners.add(self.request.user)
            self.object.save()
            return HttpResponseRedirect(self.get_success_url())
    

    CreateView 继承自 ModelFormMixinFormMixin。调用super() 只会导致保存模型并重定向到success_url。对于ManyToManyField,在创建ManyToMany 关系之前,对象需要有primary_key(即对象需要保存在数据库中),因此,通过显式调用以下方法来覆盖form_valid() 方法两个父类都可以解决您的问题。

    【讨论】:

      猜你喜欢
      • 2013-09-08
      • 2015-03-08
      • 2012-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-03
      • 2019-03-01
      • 1970-01-01
      相关资源
      最近更新 更多