Вопрос по созданию форм в Django
Всем добрый день! Досталась мне на курсах по Джанго следующая задача - нужно было сделать форму для того, чтобы пользователи могли создавать посты на сайте. Сделал традиционным способом - сначала создал нужный класс, а потом view-функцию, совместив в ней методы POST и GET:
def post_create(request):
if request.method == "POST":
form = PostForm(request.POST)
if form.is_valid():
form = form.save(commit=False)
form.author = request.user
form.save()
return redirect('posts_space:profile', username=form.author)
form = PostForm()
return render(request, 'posts/create_post.html/', {'form': form})```
Однако проверяющий сказал, что это можно сделать рациональнее и проще. Он скинул ссылку вот сюда - https://stackoverflow.com/questions/38251922/logic-behind-formrequest-post-or-none.
При этом, основной акцент он сделал на том, что нужно избавиться от проверки if request.method == "POST", а также нужно избавиться от повторного вызова form = PostForm().
Изучив материал по ссылке я понял, что если некий объект (наверное, словарь?) QueryDict является пустым, то PostForm будет вызвана с пустыми скобками, а если в QueryDict содержатся данные, то PostForm вызывается в виде form = PostForm(request.POST), то есть, аргумент request.POST подставляется, если я правильно понял, автоматически.
К сожалению, дальше мне продвинутся в своих изысканиях не удалось, поэтому прошу помочь понять следующие вопросы:
1) Что такое QueryDict?
2) В какой момент работы кода он создается и каким образом наполняется данными?
3) Как эту всю информацию можно применить к моему заданию, так, чтобы избавиться от проверки if request.method == "POST" и от повторного вызова form = PostForm()?
Всем заранее спасибо!
Попробуй так, должно сработать:
def post_create(request):
# передаем POST если он есть, иначе None
form = PostForm(request.POST or None)
if form.is_valid():
form = form.save(commit=False)
form.author = request.user
form.save()
return redirect('posts_space:profile', username=form.author)
return render(request, 'posts/create_post.html/', {'form': form})
(Не проверено!)