【问题标题】:How to save user in Django?如何在 Django 中保存用户?
【发布时间】:2015-03-03 14:44:40
【问题描述】:

我找不到这个问题的答案,我猜这对 Django 来说很容易。

我只是想在模型中定义一个author 字段,如下所示:

class Article(models.Model):
    author = models.ForeignKey(User)

似乎没有像author = models.ForeignKey(User, default=current_user) 这样简单的方法,那么将当前登录的用户存储在数据库中的最简单方法是什么? (如果未登录,可以使用名为“匿名”的预定义默认用户)

感谢您的帮助!

【问题讨论】:

    标签: django django-models django-users


    【解决方案1】:

    当前登录的用户在视图中作为request.user 属性可用:

    def create_article(request):
       ...
       if request.user.is_active():
           article.author = request.user                          
       article.save()
       ...
    

    【讨论】:

    • 谢谢。所以我想确保我不能只通过更改模型来做到这一点?
    • 我会稍微进一步修改和/或使用request.user.is_active()
    • 不,您不能在模型级别执行此操作。
    • @warath-coder 谢谢指正,我更新了答案。
    【解决方案2】:

    或者,您可以将request.user 传递给您的表单类并覆盖保存:

    class ArticleForm(forms.ModelForm):
    
        class Meta:
            model = Article
    
        def __init__(self, *args, **kwargs):
            # Allows you to pass the user in from the request, or just set the property
            if not hasattr(self, 'user'):
                self.user = kwargs.pop('user')
            super(ArticleForm, self).__init__(*args, **kwargs)
    
        def save(self, commit=True)
            article = super(ArticleForm, self).save(commit=False)
            article.user = self.user
            if commit:
                article.save()
            return article
    

    代码稍微多一些,但是封装在表单类中而不是视图中,所以你可以在多个地方使用它。

    示例用法:

    # in a view
    @login_required
    def your_view(request):
        form = ArticleForm(request.POST or None, user=request.user)
        . . .
    
    # in Django admin
    class ArticleAdmin(admin.ModelAdmin):
    
        form = ArticleForm
    
        def get_form(self, request, obj=None, **kwargs):
            form = super(ArticleAdmin, self).get_form(request, obj, **kwargs)
            form.user = request.user
            return form
    

    在任一用例中,您都可以确保您拥有经过身份验证的用户。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-27
      • 2017-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多