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>

enter image description here

Вы используете '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']
        ...
Вернуться на верх