Как в форму добавить поле ForeignKey?

По ходу разработки сайта возникла такая проблема: в общем, юзер может создавать свою статью => в модели у статьи есть ForeignKey author, представляющий собой id автора. Форму для написания статьи я сделала с помощью ModelForm, а не просто Form (я считаю, так логичнее, ибо она как бы напрямую взаимодействует с моделью) Но как добавить это поле в форму? Я же не могу передать в fields еще и значение author_id. Его нельзя ввести, оно должно доставаться самостоятельно из POST-запроса:

author = request.user.id

Тогда как сделать, чтобы форма сохраняла еще и id? Иначе ошибка 'NOT NULL CONSTRAINT FAILED', что логично, ибо форма не может взять ниоткуда pk, а в модели он null=False. Тут придется с помощью класса Form форму создавать? Иначе никак? Думала переопределить метод save() так, чтобы он принимал id, тогда все будет без проблем работать, но решила, что идея плохая: если что пойдет не так, то трудно будет потом все обратно вернуть и понять в чем ошибка, сразу теряется адекватный доступ к БД. Что-то конкретно туплю... Вообще без понятия, как это реализовать...

Прилагаю код формы:

class ArticleForm(ModelForm):
    class Meta:
        model = Article
        fields = ['title', 'content']
        widgets = {'title' : TextInput(attrs={'class' : 'create_article_title', 'placeholder' : 'Введите заголовок...' }),
               'content' : Textarea(attrs={'class' : 'create_article_content', 'placeholder' : 'Ваша будущая статья...' })}

... и модели:

class Article(Model):
    title        = CharField(max_length=30)
    content      = CharField(max_length=5000)
    author       = ForeignKey(User, on_delete=CASCADE)
    rating       = IntegerField(default=0)
    created      = DateField(auto_now_add=True)
    last_updated = DateField(auto_now_add=True)

    articles = ArticleManager()
    objects = Manager()

Очень нужна помощь, вообще не могу сообразить, как это сделать... И да, надеюсь я понятно объяснила проблему, ибо она мне самой кажется какой-то странной и нелогичной(


Ответы (1 шт):

Автор решения: Medvedev

На самом деле все проще и необходимые значения вы можете передать в функции в вашем представлении:

def create_posts(request):
    if request.method == 'POST':
        form = ArticleForm(request.POST)
        if form.is_valid():
            # здесь говорим не сохранять данные в БД
            creater = form.save(commit=False)
            creater.author = request.user.id  # передаем значение для поля автора
            creater.save() # и далее всё по порядку сохраняем
            form.save()
            return redirect('home')  # как пример после успеха вернуться на главную страницу
    else:
        form = ArticleForm()
→ Ссылка