Class 基于视图 (CBV)、CreateView 和 request.user 具有多对多关系
Class Based Views (CBV), CreateView and request.user with a many-to-many relation
基于 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.
如何避免这种情况?
像这样编辑您的视图,
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
继承自 ModelFormMixin
和 FormMixin
。调用 super()
只会导致保存模型并重定向到 success_url
。在 ManyToManyField
的情况下,对象在创建 ManyToMany
关系之前需要有一个 primary_key
(即,对象需要保存在数据库中),因此,覆盖 form_valid()
方法通过显式调用父方法 类 可以解决您的问题。
基于 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.
如何避免这种情况?
像这样编辑您的视图,
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
继承自 ModelFormMixin
和 FormMixin
。调用 super()
只会导致保存模型并重定向到 success_url
。在 ManyToManyField
的情况下,对象在创建 ManyToMany
关系之前需要有一个 primary_key
(即,对象需要保存在数据库中),因此,覆盖 form_valid()
方法通过显式调用父方法 类 可以解决您的问题。