【问题标题】:400 (Bad Request) from Django Ajax POST Request来自 Django Ajax POST 请求的 400(错误请求)
【发布时间】:2017-01-04 20:49:44
【问题描述】:

我已经阅读了无数关于此问题的 SO 主题,但我无法在不产生 400(错误请求)控制台错误的情况下提交表单。

此时我已经尝试了所有方法;太多选项无法列出。我希望有人能指出我正确的方向。下面是我的代码片段——我已经包含了所有相关的片段。谢谢。

Django==1.10.3 jQuery==2.2.4

tag.py

@register.inclusion_tag('tags/_plaque-order-form.html', takes_context=True)
def plaque_order_form(context):
    title = 'Plaque Order Form'
    form = PlaqueOrderForm()
    context = {
        'form': form,
        'title': title,
    }
    return context

订购单

<form action="{% url 'contribute:plaque_order_form' %}" method="POST" id="plaqueOrderForm">
  {% csrf_token %}
  {% for field in form %}
    {{ field }}
  {% endfor %}
  <button class="btn btn-black no-margin-bottom btn-small" type="submit" id="plaqueOrderFormBTN">Submit</button>
</form>

网址

urlpatterns = [
    url(r'^$', index, name='home'),
    url(r'^plaque_order_form/$', plaque_order_form, name='plaque_order_form')
]

在模板中插入表单作为标签包含

{% plaque_order_form %}

查看

def plaque_order_form(request):
    if request.method == "POST":
        form = PlaqueOrderForm(request.POST)
        if form.is_valid():
            first_name = form.cleaned_data['first_name']
            last_name = form.cleaned_data['last_name']
            subject = 'New Plaque Order'
            from_email = settings.DEFAULT_FROM_EMAIL
            recipient_list = [from_email, 'chris@somewhere.net']
            ctx = {
                'subject': subject,
                'first_name': first_name,
                'last_name': last_name
            }

            message = get_template('email_forms/plaque_order_form_email.html').render(Context(ctx))
            msg = EmailMessage(subject, message, from_email=from_email, to=recipient_list)
            msg.content_subtype = 'html'
            msg.send()

            messages.success(request, "Thank you for your order; someone will be in touch with you shortly")

        if form.errors:
            json_data = json.dumps(form.errors)
            return HttpResponseBadRequest(json_data, content_type='application/json')
    else:
        raise Http404

    return HttpResponse(plaque_order_form, mimetype='application/json')

ajax

<script type="text/javascript">
    $(document).ready(function () {
        var csrftoken = $.cookie('csrftoken');

        function csrfSafeMethod(method) {
            // these HTTP methods do not require CSRF protection
            return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
        }

        $.ajaxSetup({
            beforeSend: function (xhr, settings) {
                if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                    xhr.setRequestHeader("X-CSRFToken", csrftoken);
                }
            }
        });

        $('#plaqueOrderFormBTN').click(function (e) {
            e.preventDefault();
            var mForm = $('plaqueOrderForm').serialize();
            console.log(mForm);
            $.ajax({
                type: 'POST',
                url: '{% url 'contribute:plaque_order_form' %}',
                dataType: "json",
                contentType: "application/json; charset=utf-8",
                data: JSON.stringify(mForm),
                success: function (e) {
                    alert(e)
                },
                error: function (e) {
                    console.log(e);
                }
            });
            return false;
        })
    })
</script>

【问题讨论】:

    标签: jquery ajax django django-forms django-views


    【解决方案1】:

    form.errors 表示您的 form cannot get values corresponding to fields first_name and last_name from request.POST.而不是序列化表单,请尝试

    data = {
        'first_name': $('#first_name').val(),
        'last_name': $('#last_name').val()
    }
    

    将#first_name 和#last_name 替换为适当的ID。然后可以通过request.POST访问first_name和last name。如果您仍然遇到问题,请使用 ipdb 并在指定断点处放入 shell,然后检查 request.POST 中的发布数据。

    HTH :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      • 2015-06-02
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 2017-12-24
      相关资源
      最近更新 更多