Как предварительно заполнить поле в 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.

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