如何在 Django 的 CreateView 提交操作中保存当前登录的用户名?
Posted
技术标签:
【中文标题】如何在 Django 的 CreateView 提交操作中保存当前登录的用户名?【英文标题】:How do I save the current logged in username in the CreateView submit action in Django? 【发布时间】:2014-10-04 16:13:20 【问题描述】:我想创建一个餐厅评论提交页面,其中提交评论的用户的用户名保存在数据库表中。我想我必须重写 CreateView 的保存方法,但我不知道如何。
这是我到目前为止所拥有的。
views.py
class WriteReview(CreateView):
model = Review
success_url = reverse_lazy('restaurant_list')
fields = ['restaurant','review']
models.py
class Review(models.Model):
restaurant = models.ForeignKey('Restaurant')
review = models.TextField()
user = models.CharField(default='', max_length=100)
time = models.DateTimeField(auto_now_add=True)
def __str__(self):
return "%s review: %s..." % (self.restaurant, self.review[:20])
【问题讨论】:
我通过自定义 form_valid 方法解决了这个问题。代码如下: def form_valid(self, form): form.instance.user = self.request.user return super(WriteReview, self).form_valid(form) 【参考方案1】:我更改了我的类以添加一个自定义方法,如下所示。
class WriteReview(CreateView):
model = Review
success_url = reverse_lazy('restaurant_list')
fields = ['restaurant','review']
def form_valid(self, form):
form.instance.user = self.request.user
return super(WriteReview, self).form_valid(form)
成功了! :)
【讨论】:
【参考方案2】:正如您所说,您的答案有效,但这样编写模型会更有意义(代码假设您已经导入了 User
模型:
class Review(models.Model):
restaurant = models.ForeignKey('Restaurant')
review = models.TextField()
user = models.ForeignKey(User)
time = models.DateTimeField(auto_now_add=True)
现在该表实际上与User
相关,因此用户详细信息的更改将传播到Review
模型。然后,您还可以利用点符号等方便的快捷方式从Review
实例访问User
属性,或者查看所有任何用户实例,我们将调用我们的u
,使用u.review_set.all()
进行评论。您仍然可以将用户设置为在 form_valid
方法中提交表单的用户,如下所示:
class WriteReview(CreateView):
...
def form_valid(self, form):
self.object = form.save(commit=False)
self.object.user = self.request.user
self.object.save()
return HttpResponseRedirect(self.get_success_url())
【讨论】:
很高兴你提出来,因为我试图找到答案。但是,我想在使用通用 CreateView 时创建 ForeignKey 关系。你的代码有可能吗?还是我也必须修改我的视图类? 我想知道,当有 ForeignKey 关系时,Django 不是保存用户的 id 而不是用户名本身吗?所以如果我坚持我原来的代码,但是把form_valid方法的第一行改成这样:form.instance.user = self.request.user.id,会不会行不通? 我从来没有这样做过,我现在不在我的开发机器上检查,但试试看,我看不出有任何危害。 它有效。我不得不重新创建数据库,但不知何故它在迁移时遇到了问题。 另外,您不必保存用户 ID.. 只需保存用户,它会自动转换为用户 ID,因为它在模型中声明为 ForeignKey 用户模型。基本上上面的行没有用,但是这----> form.instance.user = self.request.user 确实有效!嗯。还有很多要学的。 :)以上是关于如何在 Django 的 CreateView 提交操作中保存当前登录的用户名?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用请求数据在基于 Django 类的通用 createview 上设置初始数据
Django - 如何使用CreateView扩展自定义用户
Django - 如何在相关模型上为外键创建多个选择(在 CreateView 上)?
Django:如何在新模板中的另一个模型上使用 CreateView 的 form_valid() 返回的响应?