如何在Django中保存用户?

时间:2015-03-03 14:44:40

标签: django django-models django-users

我无法找到这个问题的答案,我猜这对Django来说非常容易。

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

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

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

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

或者,您可以将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

在任何一种使用案例中,您都可以放心,您拥有经过身份验证的用户。