Как передать имя авторизованного пользователя в форму создания записи?
Делаю первые шаги в изучении 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'}),
}
Я уже поискал похожие вопросы, но к моему случаю применить не смог. Буду рад любой помощи или быть может объяснению того как это должно работать, ведь вопрос казалось бы несложный, но моих скудный знаний и понимания для него оказалось недостаточно.
Спасибо.
В итоге я не разобравшись с классом нашел ещё один похожий вопрос, но там использовалась функция, так что переписал класс на функцию и выглядит теперь это следующим образом:
- В 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'}),
}
- В 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})
Если всё-таки есть возможность сделать тоже самое с указанным ранее классом, то тоже было бы интересно увидеть решение.