Как я могу получить зарегистрированного пользователя в методе save?

Как я могу получить зарегистрированного пользователя, self.request.user, в методе save в файле models.py?


Ответы (1 шт):

Автор решения: Andrey Maslov

как написали в комментарии метод save у модели не имеет никакой связи с запросами, если по каким-то причинам тебе нужно, что бы при сохранении как-то использовать пользователя из request.user, то тебе нужно этого пользователя передать в ModelForm, которую используешь для сохранения модели. Например есть модель:

class Comment(models.Model):
   text = models.TextField(label="Комментарий")
   user = models.ForeignKey(User, blank=True)
   ...

есть форма для редактирования. в эту форму добавим обработку параметра request_user

class CommentEditForm(forms.ModelForm):
    class Meta:
        exclude = ('user',)
        model = Comment

    def __init__(self, *args, **kwargs):
        self.request_user = kwargs.pop('request_user', None)
        super().__init__(*args, **kwargs)

    def clean():
        cleaned_data = super().clean()
        if self.request_user.is_anonymous():
            self.add_error(None, 'Для того, что бы оставить комментарий зарегистрируйтесь')
        return cleaned_data

    def save(self, *args, **kwargs):
        self.instance.user = self.request_user
        return super().save(*args, **kwargs)

теперь во view, который отвечает за сохранение модели будем передавать значение request.user в форму

def comment_save_view(request, id=None):
    try:
        comment = Comment.objects.get(id=id) if id else None
    except Comment.DoesNotExist:
        comment = None
    form = CommentEditForm(request.POST if request.POST else None, request_user = request.user)
    if request.POST:
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('url to redirect')
    return render(request, 'template.html', {
        'form': form,
    })
→ Ссылка