繁体   English   中英

添加自定义布局时,Django Crispy表单无法保存

[英]Django Crispy forms doesn't save when custom layout is added

从views.py:

class EmployeeUpdateView(LoginRequiredMixin, UpdateView):
    model = Employee
    template_name = "employee_update.html"
    form_class = EmployeeUpdateForm

从forms.py:

class EmployeeForm(forms.ModelForm):
    departments = DepartmentChoiceField()

    def __init__(self, *args, **kwargs):
        super(EmployeeForm, self).__init__(*args, **kwargs)

        self.helper = FormHelper()
        self.helper.form_class = "form-vertical"
        self.helper.form_tag = False
        self.helper.layout = Layout(
            Div(Field('first_name'), css_class="row col-md-5 emp-firstname"),
            Div(Field('last_name'), css_class="row col-md-5"),
            Div(Field('title'), css_class="row col-md-10"),
            Div(Field('email'), css_class="row col-md-10"),
            Div(Field('phone_number'), css_class="row col-md-10"),
            Div(Field('slack_username'), css_class="row col-md-10"),
            Div(Field('department'), css_class="row col-md-5"),
            Div(
                Div(Field('facility_agent', template="field_checkbox_awesome.html"), css_class="row checkbox checkbox-doorman"),
                Div(Field('company_agent', template="field_checkbox_awesome.html"), css_class="row checkbox checkbox-doorman"),
                Div(Field('contact_for_company_delivery', template="field_checkbox_awesome.html"), css_class="row checkbox checkbox-doorman"),
                Div(Field('contact_for_facility_delivery', template="field_checkbox_awesome.html"), css_class="row checkbox checkbox-doorman"),
                css_class="row col-md-5 emp-department"),
            Div(Field('mugshot'), css_class="row col-md-10"),
            Div(Field('company'), css_class="row col-md-10"),
            Div(Field('facility'), css_class="row col-md-10")
        )
        self.request = kwargs.pop('request', None)
        self.fields['first_name'].label = "first name"
        self.fields['last_name'].label = "last name"
        self.fields['title'].label = "title"
        self.fields['email'].label = "email"
        self.fields['phone_number'].label = "phone #"
        self.fields['slack_username'].label = "slack name"
        self.fields['facility_agent'].label = "facility agent"
        self.fields['company_agent'].label = "company agent"
        self.fields['contact_for_company_delivery'].label = "contact for company delivery"
        self.fields['contact_for_facility_delivery'].label = "contact for facility delivery"

    class Meta:
        model = Employee


class EmployeeCreateForm(EmployeeForm):
    def __init__(self, *args, **kwargs):
        super(EmployeeCreateForm, self).__init__(*args, **kwargs)


class EmployeeUpdateForm(EmployeeForm):
    def __init__(self, *args, **kwargs):
        super(EmployeeUpdateForm, self).__init__(*args, **kwargs)

        employee = Employee.objects.filter(pk=self.instance.pk).first()
        self.fields['departments'].set_company(employee.department_id)

和urls.py:

url(r'employees/(?P<pk>[0-9]+)/$', EmployeeUpdateView.as_view(), name="employee_update"),

如果我注释掉views.py中的“ form_class =”行,则将保存所做的编辑。 如果我将其放入,则不会进行编辑。 这些字段肯定是通过POST发送的,并且在控制台上没有记录任何错误。

因为未调用form_valid ,这意味着问题不在于您的表单未保存,而是您传递给表单的数据未通过验证。 在这里看一下docs

要调试该问题, form_invalid()在您的视图中放置一个form_invalid()方法或在表单中放置一个自定义的clean()方法 ,然后查看为什么表单无法验证。 即,检查表单实例中的错误并查看显示的内容。 那应该回答你的问题。

您正在调用的某些方法可能会或可能不会使表单无效,甚至无法实例化。 我不确定set_company方法在字段上的作用,但是可能会出现错误,导致表单无法正确设置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM