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

Делаю первые шаги в изучении Django. Читаю документацию, смотрю гайды и пытаюсь сделать учебный проект.

Добавил регистрацию/авторизацию из коробки без каких-либо модификаций со стандартной моделью User. Есть форма создания записи. В ней поля и одно из полей "автор" хотелось бы заполнить автоматически с помощью username так как доступ к форме получают только после авторизации.

Модель Post где содержится информация о записи:

class Post(models.Model):
    title = models.CharField(max_length=255, verbose_name='Название')
    slug = models.SlugField(max_length=255, verbose_name='Url', unique=True)
    author = models.CharField(max_length=100, verbose_name='Автор')
    content = models.TextField(blank=True, verbose_name='Текст')
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='Опубликовано')
    photo = models.ImageField(upload_to='photos/%Y/%m/%d/', blank=True, verbose_name='Изображение')
    views = models.IntegerField(default=0, verbose_name='Просмотров')
    category = models.ForeignKey(Category, on_delete=models.PROTECT, related_name='posts', verbose_name='Категория')
    tags = models.ManyToManyField(Tag, blank=True, related_name='posts', verbose_name='Тэги')

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('post', kwargs={"slug": self.slug})

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.title)
        return super().save(*args, **kwargs)

    class Meta:
        ordering = ['-created_at']
        verbose_name = 'Статья'
        verbose_name_plural = 'Статьи'

Класс во views создающий форму с полями на основании формы PostForm и передающий html шаблон:

class CreatePost(CreateView):
    form_class = PostForm
    template_name = 'blog/add_post.html'

Форма из forms:

class PostForm(forms.ModelForm):
    class Meta:
        model = Post

        fields = ['title', 'author', 'content', 'category', 'tags']
        widgets = {
            'title': forms.TextInput(attrs={'class': 'form-control'}),
            'author': forms.TextInput(attrs={'class': 'form-control'}),
            'content': forms.Textarea(attrs={'class': 'form-control', 'rows': 5}),
            'category': forms.Select(attrs={'class': 'form-control'}),
            'tags': forms.SelectMultiple(attrs={'class': 'form-control'}),
        }

Я уже поискал похожие вопросы, но к моему случаю применить не смог. Буду рад любой помощи или быть может объяснению того как это должно работать, ведь вопрос казалось бы несложный, но моих скудный знаний и понимания для него оказалось недостаточно.

Спасибо.

В итоге я не разобравшись с классом нашел ещё один похожий вопрос, но там использовалась функция, так что переписал класс на функцию и выглядит теперь это следующим образом:

  1. В forms я скрыл поле "автор":
class PostForm(forms.ModelForm):
    class Meta:
        model = Post

        fields = ['title', 'author', 'content', 'category', 'tags']
        # fields['author'].widget = forms.HiddenInput()
        widgets = {
            'title': forms.TextInput(attrs={'class': 'form-control'}),
            'author': forms.HiddenInput(),
            'content': forms.Textarea(attrs={'class': 'form-control', 'rows': 5}),
            'category': forms.Select(attrs={'class': 'form-control'}),
            'tags': forms.SelectMultiple(attrs={'class': 'form-control'}),
        }
  1. В views я изменил класс на функцию:
def create_post(request):
    data = request.POST.copy()
    data.update({'author': request.user})
    form = PostForm(data)
    if form.is_valid():
        form.author = request.user
        form.save()
        return redirect('home')
    else:
        form = PostForm()
    return render(request, 'blog/add_post.html', {'form': form})

Если всё-таки есть возможность сделать тоже самое с указанным ранее классом, то тоже было бы интересно увидеть решение.

Вернуться на верх