Django引导:窗体模式,检查错误

Django引导:窗体模式,检查错误,django,forms,twitter-bootstrap,Django,Forms,Twitter Bootstrap,我在模态引导(弹出)中有一个表单。问题在于,当Django没有清理表单时,表单字段下方的错误会以红色书写,但模式会关闭 用户认为表单是有效的,但不是 我的表格: class signupForm(forms.Form): username = forms.CharField(max_length=25) mail = forms.EmailField(label="Email", max_length=82) password = forms.CharField(m

我在模态引导(弹出)中有一个表单。问题在于,当Django没有清理表单时,表单字段下方的错误会以红色书写,但模式会关闭

用户认为表单是有效的,但不是

我的表格:

class signupForm(forms.Form):
     username = forms.CharField(max_length=25)
     mail = forms.EmailField(label="Email", max_length=82)
     password = forms.CharField(max_length=50)

def clean_mail(self):
    mail = self.cleaned_data['mail']
    testMail = User.objects.filter(email=mail)
    if len(testMail)>0:
        raise forms.ValidationError("Already used.")
    return mail
观点:

def signup(request):

    if request.method == "POST":
        form = signup(request.POST)
        if form.is_valid():
            mail = form.cleaned_data["mail"]
            username = form.cleaned_data["username"]
            password = form.cleaned_data["password"]
            u = User.objects.create_user(username,mail,password)
            u.save()
            the_user = authenticate(username=username, password=password)
            login(request,the_user)
            return redirect(...)
        else :
            error = True
    else :
        form = signupForm()
    return render(request,...)
最后,最重要的是模板:

<a href="#" data-toggle="modal" data-target="#myModal"><i> Signup </i></a>

    <div id="myModal" class="modal fade" role="dialog">
            <div class="modal-dialog">


                <div class="modal-content">
                    <div class="modal-header">
                        <button type="button" class="close" data-dismiss="modal">&times;</button>
                        <h3 class="modal-title"> <b> Signup </b> </h3>
                    </div>
                    <div class="modal-body">
                        {% load bootstrap %}
                        <form method="POST" action="{% url 'signup' %}" class="">
                            {% csrf_token %}

                            <div class="row">
                                <div class="col-md-offset-2 col-md-8">
                                    {{ formSignup|bootstrap }}
                                </div>
                            </div>

                            <div class="div-button">
                                <input type="submit" class="btn btn-info" value="Sign up">
                            </div>
                        </form>
                    </div>
                    <div class="modal-footer">
                        <button type="button" class="btn btn-default" data-dismiss="modal">Quit</button>
                    </div>
                </div>

            </div>
        </div>

&时代;
报名
{%load bootstrap%}
{%csrf_令牌%}
{{formSignup | bootstrap}}
退出

当表单未清理时,如何保留注册表单(模式引导)?

我也遇到了这个问题。我能够通过引用解决这个问题。注意,我正在使用和AJAX表单提交

表格:

class SomeForm(models.ModelForm):

def __init__(self, data=None, *args, **kwargs):
    super(SomeForm, self).__init__(data, *args, **kwargs)

    self.helper = FormHelper()
    self.helper.form_class = "form-horizontal"
    self.helper.form_id = "id_some_form"
    self.helper.form_action = reverse('some-form-url')
    self.helper.label_class = 'col-md-4'
    self.helper.field_class = 'col-md-6'
    self.helper.layout = Layout(
        Fieldset('The Details',
                 'field1',
                 'field2',
                 ),
        Fieldset('',
                 Div(
                     Button('cancel', 'Cancel', css_class='btn btn-danger', data_dismiss="modal"),
                     Submit('submit', 'Create', css_class='btn btn-success'),
                     css_class='col-md-10 text-right',
                 ),
        ),
    )
观点:

    form = SomeForm(request.POST)

    if form.is_valid():
        ...
    elif form.non_field_errors():
        form.helper['field2'].wrap(Div, css_class="has-error")
模板中触发模式表单的HTML:

                            <button class="btn btn-xs btn-success"
                                onclick="launchModalForm(this)"
                                data-title="Add New Thing"
                                data-target-url="{% url 'thing-create' %}"
                                data-success-url="{% url 'thing-list' %}">

                            <span class="glyphicon glyphicon-plus-sign"></span>
                            Add Thing
                        </button>
Javascript for AJAX表单在引导模式窗口中呈现/提交:

    {% load crispy_forms_tags %}
    {% crispy form %}
var formAjaxSubmit = function(form, modal, success_url) {
    $(form).submit(function (e) {
        e.preventDefault();
        $.ajax({
            type: $(this).attr('method'),
            url: $(this).attr('action'),
            data: $(this).serialize(),
            success: function (xhr, ajaxOptions, thrownError) {
                if ( $(xhr).find('.has-error').length > 0 ) {
                    $(modal).find('.modal-body').html(xhr);
                    formAjaxSubmit(form, modal, success_url);
                } else {
                    // $(modal).modal('toggle');
                    window.location.href = success_url;
                }
            },
            error: function (xhr, ajaxOptions, thrownError) {
            }
        });
    });
};
window.launchModalForm = function(value) {
    var modal_title = $(value).attr('data-title');
    var modal_target_url = $(value).attr('data-target-url');
    var success_url = $(value).attr('data-success-url');
    $('.modal-title').text(modal_title);
    $('#form-modal-body').load(modal_target_url, function () {
        $('#form-modal').modal('toggle');
        formAjaxSubmit('#form-modal-body form', '#form-modal', success_url);
    });
};

我也遇到了这个问题。我能够通过引用解决这个问题。注意,我正在使用和AJAX表单提交

表格:

class SomeForm(models.ModelForm):

def __init__(self, data=None, *args, **kwargs):
    super(SomeForm, self).__init__(data, *args, **kwargs)

    self.helper = FormHelper()
    self.helper.form_class = "form-horizontal"
    self.helper.form_id = "id_some_form"
    self.helper.form_action = reverse('some-form-url')
    self.helper.label_class = 'col-md-4'
    self.helper.field_class = 'col-md-6'
    self.helper.layout = Layout(
        Fieldset('The Details',
                 'field1',
                 'field2',
                 ),
        Fieldset('',
                 Div(
                     Button('cancel', 'Cancel', css_class='btn btn-danger', data_dismiss="modal"),
                     Submit('submit', 'Create', css_class='btn btn-success'),
                     css_class='col-md-10 text-right',
                 ),
        ),
    )
观点:

    form = SomeForm(request.POST)

    if form.is_valid():
        ...
    elif form.non_field_errors():
        form.helper['field2'].wrap(Div, css_class="has-error")
模板中触发模式表单的HTML:

                            <button class="btn btn-xs btn-success"
                                onclick="launchModalForm(this)"
                                data-title="Add New Thing"
                                data-target-url="{% url 'thing-create' %}"
                                data-success-url="{% url 'thing-list' %}">

                            <span class="glyphicon glyphicon-plus-sign"></span>
                            Add Thing
                        </button>
Javascript for AJAX表单在引导模式窗口中呈现/提交:

    {% load crispy_forms_tags %}
    {% crispy form %}
var formAjaxSubmit = function(form, modal, success_url) {
    $(form).submit(function (e) {
        e.preventDefault();
        $.ajax({
            type: $(this).attr('method'),
            url: $(this).attr('action'),
            data: $(this).serialize(),
            success: function (xhr, ajaxOptions, thrownError) {
                if ( $(xhr).find('.has-error').length > 0 ) {
                    $(modal).find('.modal-body').html(xhr);
                    formAjaxSubmit(form, modal, success_url);
                } else {
                    // $(modal).modal('toggle');
                    window.location.href = success_url;
                }
            },
            error: function (xhr, ajaxOptions, thrownError) {
            }
        });
    });
};
window.launchModalForm = function(value) {
    var modal_title = $(value).attr('data-title');
    var modal_target_url = $(value).attr('data-target-url');
    var success_url = $(value).attr('data-success-url');
    $('.modal-title').text(modal_title);
    $('#form-modal-body').load(modal_target_url, function () {
        $('#form-modal').modal('toggle');
        formAjaxSubmit('#form-modal-body form', '#form-modal', success_url);
    });
};

你找到解决办法了吗?如果是,你能分享吗?你找到解决这个问题的方法了吗?如果是,你能分享吗?