使用Ajax验证并提交Django表单(django-crispy-forms)

时间:2018-02-11 20:19:22

标签: python jquery ajax django django-forms

我是django和web开发的新手。我需要帮助提交Django表单(使用django-crispy-forms)和Ajax我如何:

  1. 验证输入

  2. 提交而不重新加载

  3. 在验证失败时显示错误

  4. 现在我可以提交表单并将条目保存到数据库中,但在此过程中重新加载整个页面。 我在下面列出了我的代码的相关摘要

    // forms.py

    class SubscriptionForm(forms.ModelForm):
        def __init__(self, *args, **kwargs):
            super(SubscriptionForm, self).__init__(*args, **kwargs)
            self.helper = FormHelper()
            self.helper.template_pack = 'bootstrap3'
            self.helper.form_tag        = True
            self.helper.form_id         = 'sub-form-1'
            self.helper.form_class      = 'form-inline'
            self.helper.field_template  = 'bootstrap3/inline_field.html'
            self.helper.layout          = Layout(
    
                Div(Div(css_class='sub-form-notifications-content'),
                    css_class='sub-form-notifications'),
    
                InlineField('name',  id='subName'),
                InlineField('email', id='subEmail'),
    
                FormActions(Submit('submit', 'Notify me', css_class='form-control')),
    
        )
    
    class Meta:
        model = Sub
        fields = "__all__"
    
    def clean_email(self):
        """
       Validate that the supplied email address is unique for the
       site.
    
       """
        if User.objects.filter(email__iexact=self.cleaned_data['email']):
            raise forms.ValidationError(
                _("This email address is already in use. Please supply a different email address."))
        return self.cleaned_data['email']
    

    // views.py

    from django.shortcuts import render, redirect
    from .forms import SubscriptionForm
    from .models import Sub
    
    
    def index(request):
        if request.method == 'POST':
            sub_form = SubscriptionForm(request.POST)
            if sub_form.is_valid():
                sub_form.save()
                # return redirect('landing:landing')
    
        else:
            sub_form = SubscriptionForm()
        return render(request, 'landing/index.html', {'sub-form': sub_form})
    

    // template

    ...
             {% crispy sub-form %}
    ...
    

    //呈现HTML格式

    <form class="form-inline" id="sub-form-1" method="post">
        <input type='hidden' name='csrfmiddlewaretoken'
               value='tdiucOssKfKHaF7k9FwTbgr6hbi1TwIsJyaozhTHFTKeGlphtzUbYcqf4Qtcetre'/>
        <div class="sub-form-notifications">
            <div class="sub-form-notifications-content">
            </div>
        </div>
        <div id="div_id_name" class="form-group">
            <label for="subName" class="sr-only requiredField">Name</label>
            <input type="text" name="name" maxlength="30" required placeholder="Name"
               class="textinput textInput form-control" id="subName"/>
        </div>
        <div id="div_id_email" class="form-group"><label for="subEmail" class="sr-only requiredField">Email address</label>
            <input type="email" name="email" maxlength="60" required placeholder="Email address"
               class="emailinput form-control" id="subEmail"/>
        </div>
        <div class="form-group">
            <div class="controls ">
                <input type="submit" name="submit" value="Notify me" class="btn btn-primary" id="submit-id-sub-form"/>
            </div>
        </div>
    </form>
    

1 个答案:

答案 0 :(得分:0)

我会试着让你知道如何轻松地做到这一点。

将onsubmit事件侦听器添加到表单和错误块e。 G。下面是显示错误的表格。

<强>模板

<form class="form-inline" id="sub-form-1" method="post" onsubmit="sendData();">
    ...
</form>
<div class="error-block">
    <!-- Here is the space for errors -->
</div>

现在是将数据发送到视图以进行验证和保存的处理程序

<script>

    function sendData(e) {
        e.preventDefault(); // don not refresh the page

        var form_data = {
            name: $('input[name="name"]').val(),
            ... other field values ...
        }

        $.ajax({
            url: "{% url 'url-you-want-send-form-to' %}",
            method: "POST",
            data: form_data,
            success: function(response) {
                // here are the success data in the response
                // you can redirect the user or anything else
                //window.location.replace("{% url 'success-url' %}");
            },
            error: function(response) {
                // here are the errors which you can append to .error-block
                //$('.error-block').html(response);
            }
        })

    }

</script>

在视图中,您将收到与提交表单相同的表单中的数据,但您不必将整个模板呈现给响应,而只需要验证表单中的错误,因此您将发送视图您的ajax POST请求必须与呈现表单的视图不同。您可以创建另一个将处理它。