Как я могу автоматически назначить текущего пользователя автором при создании сообщения?
Как автоматически назначить текущего пользователя автором при создании поста?
Формы:
from django import forms
from publication.models import Userpublication
class PostForm(forms.ModelForm):
content = forms.CharField(label='',widget=forms.Textarea(attrs={'class': 'content_toggle app-textarea',
'utofocus': 'true',
'maxlength': '250',
'placeholder': 'hello',
'required': True}))
class Meta:
model = Userpublication
fields = ['content', 'author']
labels = {
'Content': False,
}
Просмотров:
def create_post(request):
if request.method == 'POST':
form = PostForm(request.POST, initial={'author': request.user})
if form.is_valid():
form.save()
return redirect('home')
else:
form = PostForm(initial={'author': request.user})
post_lists = Userpublication.objects.all()
context = {
'form': form,
'post_lists': post_lists,
}
return render(request, 'twippie/home.html', context)
введите описание изображения здесь
Вот как это работает.
Но как только я удаляю из формы поле 'author', а 'content' остается, появляется следующая ошибка:
Файл "C:\Users\user\AppData\Local\Programs\Python\Python312\Lib\site-packages
. django\db\backends\sqlite3\base.py", строка 328, in execute return super().execute(query, params) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ django.db.utils.IntegrityError: NOT NULL constraint failed: publication_userpubl ication.author_id
браузер выдает эту ошибку:
IntegrityError at /feed/ NOT NULL constraint failed: publication_userpublication.author_id
Что я мог упустить или не заметить?
моделировать при необходимости:
from django.db import models
from autoslug import AutoSlugField
from django.urls import reverse
from django.contrib.auth.models import User
from django.conf import settings
class PublishedManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(is_published=1).order_by('-time_create')
class Userpublication(models.Model):
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
slug = AutoSlugField(max_length=255, unique=True, populate_from='content')
content = models.TextField('', blank=True)
time_create = models.DateTimeField('time create ', auto_now_add=True)
time_update = models.DateTimeField('time update ', auto_now=True)
is_published = models.BooleanField('is published', default=True)
objects = models.Manager()
published = PublishedManager()
def __str__(self):
return self.slug
class Meta:
ordering = ['-time_create']
indexes = [
models.Index(fields=['-time_create'])
]
class Meta:
verbose_name = 'Post'
verbose_name_plural = 'Posts'
def get_absolute_url(self):
return reverse('post_detail', kwargs={'post_slug': self.slug})
def get_edit_url(self):
return reverse('edit_post', kwargs={'post_slug': self.slug})
Я попытался удалить автора из формы, но это дало мне ошибку. А мне нужно, чтобы автор автоматически устанавливался в поле 'author_id'
Просто получите пользователя из запроса (@see Django DOCs) & установите это поле потом в вашей форме.
def create_post(request):
user = request.user
...
Я решил свою проблему. Дело оказалось гораздо проще. У меня есть одно из приложений, которое отвечает за форму публикации и отображения постов. В приложении 2 была добавлена точно такая же функция просмотра. Мне оставалось только удалить ее, и все заработало. Вот почему она выдавала ошибку.