Вопрос по созданию форм в 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})

(Не проверено!)

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