Как в форму добавить поле 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 шт):
На самом деле все проще и необходимые значения вы можете передать в функции в вашем представлении:
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()