Django CreateView: автоматическая установка поля
Есть модель Post и Author:
class Post(models.Model):
post_author = models.ForeignKey(Author, on_delete=models.CASCADE, verbose_name='Автор')
post_text = models.TextField(null=False)
class Author(models.Model):
author = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
Во view он создается через CreateView:
class PostCreateView(CreateView):
template_name = 'news/create_post.html'
form_class = PostForm
Форма описана в таком виде:
class PostForm(ModelForm):
class Meta:
model = Post
fields = ['post_author', 'post_text']
Можно ли из формы убрать поле 'post_author' и передать автора не выбирая из списка всех авторов, так как заполняющий форму юзер сам будет являться автором. Указать в модели author как default= не получилось, т.к. в модель не смог передать объект request.
Ответы (3 шт):
Автор решения: Ihar
→ Ссылка
Можете так попробовать
class PostCreateView(CreateView):
def post(self, request, *args, **kwargs):
form = PostForm(request.POST)
if form.is_valid():
instance = form.save(commit=False)
instance.post_author = self.request.user
instance.save()
return HttpResponseRedirect(......)
return render(request, 'news/create_post.html', {'form': form})
Автор решения: KorsarD
→ Ссылка
Спасибо за хорошую подсказку! По итогу вышло так:
# Джененрик для создания поста
class PostCreateView(PermissionRequiredMixin, CreateView):
template_name = 'news/create_post.html'
form_class = PostForm
permission_required = ('news.add_post')
raise_exception = True
# Функция для кастомной валидации полей формы модели
def form_valid(self, form):
# создаем форму, но не отправляем его в БД, пока просто держим в памяти
fields = form.save(commit=False)
# Через реквест передаем недостающую форму, которая обязательна
fields.post_author = Author.objects.get(author=self.request.user)
# Наконец сохраняем в БД
fields.save()
return super().form_valid(form)
Автор решения: Victor Krupeichenko
→ Ссылка
models.py
from django.contrib.auth.models import User
class Post(models.Model)
post_author = models.ForeIgnKey(User, on_delete=models.CASCADE, verbose_name='Автор')
post_text = models.TexField()
forms.py
from django import forms
from .models import Post
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ['post_text']
views.py
from django.views.generic import CreateView
from .forms import PostForm
class PostCreate(CreateView):
form_class = PostForm
template_name = 'create.html'
def form_valid(self, form):
self.object = form.save(commit=False)
self.object.post_author = self.request.user
self.object.save()
return super(PostCreate, self).form_valid(form)