脆皮形式bootstrap 3提交问题

时间:2014-02-09 14:04:04

标签: django forms django-crispy-forms

这真让我难过。我可以在django中写好表格,但想使用crispy-forms bootstrap3。我可以使用此表单代码获取要呈现的表单:

类NewGuestForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super(NewGuestForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper(self)
        self.helper.form_id = 'id-newGuestForm'
        self.helper.form_class = 'form-horizontal'
        self.helper.label_class = 'col-lg-2'
        self.helper.field_class = 'col-lg-6'
        self.helper.form_method = 'post'
        self.helper.form_action = 'guest-list'
        self.helper.layout = Layout(
            Fieldset (
                'New Guest',
                'first_name',
                'last_name',
                'num_child',
                'landline',
                'mobile',
                'email'
                ),
            FormActions(
                Submit('save', 'Save changes',css_class='btn-primary'),
                Button('cancel', 'Cancel')
            )
        )

    class Meta:
        model = Guest

class BookingForm(forms.Form):         类Meta:             model =预订

    def __init__(self, *args, **kwargs):
        self.helper = FormHelper()
        self.helper.form_method = 'POST'
        self.helper.form_id = 'add-booking'
        self.helper.form_class = 'form-horizontal'
        self.helper.label_class = 'col-lg-2'
        self.helper.field_class = 'col-lg-6'
        self.helper.layout = Layout(
            Fieldset(
                '',
                'guest',
                'guest_status',
                'start_date',
                'end_date',
                'dep_recd',
                'bkd_child',
                'bkd_adult',
                'bal_recd',
                'sec_recd',
                'keys_sent',
                'sec_retn',
                'notes'
                ),
        FormActions(
            Submit('submit', "Save changes"),
            Submit('cancel', "Cancel"),
            )       
        )

        super(BookingForm, self).__init__(*args, **kwargs)

这会将表单呈现为OK,但是当我点击“提交”时,浏览器会变为白色。返回(form_action)正确显示在地址栏中,但未加载。数据不会写入数据库。表单只显示我需要的字段。

我的观点是:

class NewGuestView(CreateView):
    model = Guest
    template_name = 'new_guest.html'
    form_class = NewGuestForm

如果我将'form_class'更改为'form',表单将呈现所有字段并忽略引导列指令。此外,“提交”和“取消”按钮也不会出现。

我必须做错事,但不能为我的生活看到什么。感激地收到任何建议。

2 个答案:

答案 0 :(得分:1)

这对你来说可能有点晚了,但我今天第一次看到django-crispy-forms并遇到了和你一样的问题。如果我已定义form_action,则在提交表单后,浏览器将重定向到正确的URL,但页面为空白 - 即使刷新也是如此。无论表单是否有效,也会发生这种情况,所以很明显这是一个非常基本的问题,并且必定存在我们都做错的事情。

我通过使用视图的success_url属性解决了这个问题。所以你可以试过:

from django.core.urlresolvers import reverse_lazy

class NewGuestView(CreateView):
    ...
    success_url = reverse_lazy("guest-list")

至于按钮,我还没有定义布局并使用了这种方法:

    self.helper.add_input(Submit('submit', 'Submit'))
    self.helper.add_input(Button('cancel', 'Cancel'))

虽然值得注意的是'取消'按钮实际上并没有在这个阶段做任何事情,我还需要进一步研究。

你有没有设法让这个工作或找到另一种方法?

<强>更新

重定向失败,出现405 Method Not Allowed错误。我尝试按照this SO question在我的视图中定义post()方法,这解决了HTTP错误,但没有处理数据(没有保存新记录,也没有捕获验证错误) )。所以我一直坚持使用success_url方法,直到找到我做错的事情为止。

答案 1 :(得分:1)

现在解决了。我没有意识到我需要将字段添加到Meta类以及在Layout中列出它们。我添加了以下

    class Meta:
    model = Guest
    fields = ['first_name', 'last_name', 'email', 'landline', 'mobile']

现在表格保存好了。