如何在 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() 返回的响应?

如何将引导类添加到模板中的 Django CreateView 表单字段?

如何使用测试客户端测试 django (3.0) CreateView 的“form_valid”方法和参数?