如何使用 CreateView 将用户对象传递给模型窗体
How to pass user object to a Modelform using CreateView
NOT NULL 约束失败:blog_post.author_id
您好,我是 django 的新手,无法修复此错误。
我正在构建一个博客应用程序,我希望作者是当前用户。
我知道我没有正确地将用户对象传递给表单,但是 none 我找到的解决方案对我有用。
提前致谢!
models.py
class User(auth.models.User,auth.models.PermissionsMixin):
def __str__(self):
return '@{}'.format(self.username)
class Post(models.Model):
author = models.OneToOneField(User, on_delete=models.CASCADE)
title = models.CharField(max_length=200)
text = models.TextField()
def get_absolute_url(self):
return reverse('post_detail',kwargs={'pk':self.pk})
forms.py
class UserForm(UserCreationForm):
class Meta:
fields = ('username', 'email', 'password1', 'password2')
model = get_user_model()
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ('title', 'text',)
views.py
class SignUpView(CreateView):
form_class = UserForm
success_url = reverse_lazy('login')
template_name = 'registration/signup.html'
class PostCreateView(LoginRequiredMixin, CreateView):
login_url = '/login/'
redirect_field_name = 'blog/post_detail.html'
form_class = PostForm
model = Post
你的代码很好,只是你没有传递用户对象来更新作者字段。
我认为在您的 PostCreateView 中,您可以这样做:
class PostCreateView(LoginRequiredMixin, CreateView):
login_url = '/login/'
redirect_field_name = 'blog/post_detail.html'
form_class = PostForm
model = Post
def valid_form(self,form, **kwargs):
form.instance.author = self.request.user
super(PosetCreateView, self).get_context_data(kwargs)
return HttpResponse('/')
我找到了一个适用于我的案例的解决方案,并且与@Silas 的非常相似。
views.py
class PostCreateView(LoginRequiredMixin, CreateView):
login_url = '/login/'
redirect_field_name = 'blog/post_detail.html'
form_class = PostForm
model = Post
def form_valid(self, form):
self.object = form.save(commit=False)
self.object.author = self.request.user
self.object.save()
return super().form_valid(form)
models.py
class Post(models.Model):
author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
...
NOT NULL 约束失败:blog_post.author_id
您好,我是 django 的新手,无法修复此错误。
我正在构建一个博客应用程序,我希望作者是当前用户。
我知道我没有正确地将用户对象传递给表单,但是 none 我找到的解决方案对我有用。
提前致谢!
models.py
class User(auth.models.User,auth.models.PermissionsMixin):
def __str__(self):
return '@{}'.format(self.username)
class Post(models.Model):
author = models.OneToOneField(User, on_delete=models.CASCADE)
title = models.CharField(max_length=200)
text = models.TextField()
def get_absolute_url(self):
return reverse('post_detail',kwargs={'pk':self.pk})
forms.py
class UserForm(UserCreationForm):
class Meta:
fields = ('username', 'email', 'password1', 'password2')
model = get_user_model()
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ('title', 'text',)
views.py
class SignUpView(CreateView):
form_class = UserForm
success_url = reverse_lazy('login')
template_name = 'registration/signup.html'
class PostCreateView(LoginRequiredMixin, CreateView):
login_url = '/login/'
redirect_field_name = 'blog/post_detail.html'
form_class = PostForm
model = Post
你的代码很好,只是你没有传递用户对象来更新作者字段。
我认为在您的 PostCreateView 中,您可以这样做:
class PostCreateView(LoginRequiredMixin, CreateView):
login_url = '/login/'
redirect_field_name = 'blog/post_detail.html'
form_class = PostForm
model = Post
def valid_form(self,form, **kwargs):
form.instance.author = self.request.user
super(PosetCreateView, self).get_context_data(kwargs)
return HttpResponse('/')
我找到了一个适用于我的案例的解决方案,并且与@Silas 的非常相似。
views.py
class PostCreateView(LoginRequiredMixin, CreateView):
login_url = '/login/'
redirect_field_name = 'blog/post_detail.html'
form_class = PostForm
model = Post
def form_valid(self, form):
self.object = form.save(commit=False)
self.object.author = self.request.user
self.object.save()
return super().form_valid(form)
models.py
class Post(models.Model):
author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
...