Как предварительно заполнить поле в ModelForm значением поля по умолчанию и не включать его в саму форму
У меня есть модель Post, которая имеет поле под названием author, я смог установить текущего пользователя по умолчанию, но когда я пытаюсь не включать его в form, связанную с ним, это не удается и выдает мне различные ошибки. Вот код:
models.py:
def get_file_path(instance, filename):
file_extension = filename.split('.')[-1]
return f'user_{instance.author}/{instance.pub_date.strftime("%Y/%B/%a-%M")}/logo.{file_extension}'
class Post(models.Model):
title = models.CharField(max_length=75)
body = models.TextField()
logo = models.ImageField(upload_to=get_file_path, blank=True)
author = models.ForeignKey(User, default=get_user_model(), on_delete=models.CASCADE)
pub_date = models.DateTimeField(default=datetime.now())
forms.py:
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ('title', 'body', 'author', 'logo')
widgets = {
'title': forms.TextInput(attrs={'class': 'form-control bg-dark border border-secondary text-light'}),
'body': forms.Textarea(attrs={'class': 'form-control bg-dark border border-secondary text-light'}),
'author': forms.Select(attrs={'class': 'form-control bg-dark border border-secondary text-light'}),
'logo': forms.ClearableFileInput(attrs={'class': 'form-control bg-dark border border-secondary text-light'}),
}
views.py:
class PostCreateView(LoginRequiredMixin, CreateView):
login_url = 'login'
model = Post
form_class = PostForm
template_name = "posts/new_post.html"
Как я могу не включать поле в форму и страницу, а использовать его собственное значение по умолчанию?
ЗАМЕЧАНИЕ что я не хочу создавать поле и делать его скрытым!
Можно убрать автора из PostForm
и в PostCreateView
:
class PostCreateView(LoginRequiredMixin, CreateView):
login_url = 'login'
model = Post
form_class = PostForm
template_name = "posts/new_post.html"
def form_valid(self, form):
self.object = form.save(commit=False)
self.object.author = self.request.user
self.object.save()
return HttpResponseRedirect(self.get_success_url())
РЕДАКТИРОВАТЬ:
Я не думаю, что передача get_user_model()
по умолчанию в поле foreginkey будет работать. Этот метод вернет текущую активную модель пользователя, как объясняет django docs, но вам нужен как defaut объект пользователя или id, так что это должно быть:
author = models.ForeignKey(User, default=1, on_delete=models.CASCADE)
В этом случае вам нужно только удалить поле author из PostForm
, вам не нужно присваивать request.user в form_valid
методе PostCreateView
.