Django Creation View не сохраняет никаких данных
Мой вид создания перенаправляет на главную страницу блога хорошо после создания, но
я не могу найти ни одного созданного поста в сообщениях или на странице администратора, может кто-нибудь помочь пожалуйста
вот мое мнение
@login_required
def add_post(request):
if request.method == 'POST':
post_form = PostForm(request.POST, request.FILES, instance=request.user)
snippet_form = SnippetForm(request.POST)
if post_form.is_valid() and snippet_form.is_valid():
post = post_form.save(commit=False)
snpt = snippet_form.save(commit=False)
post.creator = request.user
snpt.id = post.id
post.save() and snpt.save()
return redirect('blog:index')
else:
post_form = PostForm()
snippet_form = SnippetForm()
return render(request, 'blog/add_post.html', {'post': post_form, 'snpt': snippet_form})
что не так в этом представлении, потому что я смог сохранить новый пост из админки добавить новый пост, но из клиента он ничего не сохраняет
Нужно ли здесь использовать метод model create() или что?
*Любой необходимый сниппет я предоставлю, но проблема в этом сниппете. Любая помощь будет очень признательна
post.save() and snpt.save()
должно быть:
post.save()
snpt.save()
Я подозреваю, что вы думали (используя ключевое слово and
), что вы хотите обеспечить сохранение обеих моделей одновременно, но на самом деле вы просите Python сравнить результаты возврата двух функций, чтобы увидеть, являются ли они обе True; это нарушает ваш код (поскольку save() возвращает None, выполняется только ваша первая save(), поскольку Python даже не будет выполнять вторую, так как они никак не могут быть обе True, когда первая уже вернула Falsey).
Вы можете найти этот вопросполезным в вашем сценарии.
в случае, если кому-то интересно узнать
Первоначально Поскольку отношение между моделью Post и моделью Snippet является OneToOne, следующая строка
snpt.id = post.id
необходимо удалить нарушит ограничение уникальности pk, если вы измените отношение на внешний ключ, это добавит еще один экземпляр сниппета с другим pk
вы можете удалить его или назначить вместо него
post.snippet = snpt
Во-вторых Нет необходимости в commit=False в snpt_form, поскольку она уже является экземпляром post_form, и я не хотел менять ничего, кроме полей формы
Третий Либо положить
creator=request.user
вместо
instance=request.user
внутри post_form
или удалить его и оставить
post.creator = request.user
форт. Также, как упомянул @bigkeefer, но это уже вторично, возникает после решения основной проблемы короткое замыкание правила старшинства python приводит к тому, что эта строка не работает
post.save() and snpt.save()
instead put
post.save()
snpt.save()