Django MultiValueDictKeyError at /create/ 'howto-input'
Я пытаюсь сделать простую форму, которая бы добавляла комментарий, я не использую forms.forms из django, я делаю формы из HTML напрямую и хочу использовать ajax для отправки формы
<views.py
def create(request):
if request.method == "POST":
content = request.POST['howto-input']
user = request.POST['howto-user']
topic = request.POST['howto-topic']
new_question = AskQuestionOnHowToTopic(user=user, content=content, topic=topic)
new_question.save()
messages.success(request, f'Published')
success = "Posted Successfully!"
return HttpResponse(success)
def howtoTutorial(request, howtocat_slug, howto_slug):
howtotut = HowToTutorial.objects.get(slug=howto_slug, howtocat=howtocat)
context = {
'howtotut': howtotut,
}
return render(request, 'howto/howto-tutorial.html', context)
urls.py
path('create/', views.create, name="create")
template.html
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<form id="howto-form">
{% csrf_token %}
<input type="text" name="content" id="howto-input" />
<input type="hidden" name="user" id="howto-user" value="{{ request.user }}" />
<input type="hidden" name="topic" id="howto-topic" value="{{ howtotut }}" />
<button class="save_btn mt-2 mb-10" type="submit">Publish</button>
</form>
<script type="text/javascript">
$(document).on("submit", "#howto-form", function (e) {
e.preventDefault();
$.ajax({
type: "POST",
// url: '/how-to/<howtocat_slug>/<howto_slug>/',
url: "/create/",
data: {
content: $("#howto-input").val(),
user: $("#howto-user").val(),
topic: $("#howto-topic").val(),
csrfmiddlewaretoken: $("input[name=csrfmiddlewaretoken]").val(),
},
success: function (data) {},
error: function (xhr, ajaxOptions, thrownError) {
alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
},
});
});
</script>
Вы используете 'content', 'topic' и 'user' в ajax, когда создаете запрос - но вы ссылаетесь на 'howto-user' и так далее в представлении django - вероятно, это целая проблема - Django не может найти ключ в словаре - вы можете легко отладить это в любой IDE - или просто вывести ключи запроса. POST.
В представлении create вы ищете ключи 'howto-input', 'howto-user' и 'howto-topic' в запросе POST. Но вы отправляете content, user и topic в вашей полезной нагрузке ajax. Между вашим представлением и запросом POST существует разрыв в паре ключ-значение.
Вы можете изменить полезную нагрузку ajax или ваше представление. (Кажется, легко изменить представление)
def create(request):
if request.method == "POST":
content = request.POST['content']
user = request.POST['user']
topic = request.POST['topic']
...
