jeff
jeff

Reputation: 13643

How to save user in Django?

I can't find the answer to this problem which I guessed was very easy for Django.

I simply want to define an author field in a model, like this:

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

It seems there is no easy way like author = models.ForeignKey(User, default=current_user) so what is the easiest way to store the currently logged in user in the database? (if not logged in, a pre-defined default user called "anonymous" can be used)

Thanks for any help!

Upvotes: 0

Views: 1143

Answers (2)

Brandon Taylor
Brandon Taylor

Reputation: 34553

Alternatively, you can pass request.user to your form class and override the save:

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

Slightly more code, but it's encapsulated in the form class and not in the view, so you can use it in more than one place.

Example usage:

# 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

In either use case, you can be assured you have an authenticated user.

Upvotes: 0

catavaran
catavaran

Reputation: 45565

Currently logged user is available in the view as the request.user attribute:

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

Upvotes: 2

Related Questions