python - Django Update 和 CreateView 使用相同的 Crispy Form,添加 View 错误

标签 python django

我使用相同的脆皮表单进行添加和编辑,并添加了一个变量,以便我可以将提交按钮文本从“添加”更改为“编辑”,反之亦然。

但是添加 View 出现以下错误:

Traceback: (removed the in built references) 

...

File "/itapp/itapp/sites/views.py" in dispatch
  954.         return super(AddSubnet, self).dispatch(*args, **kwargs)

...

File "/itapp/itapp/sites/views.py" in get_context_data
  969.         context = super().get_context_data(**kwargs)

File "/usr/local/lib/python3.6/site-packages/django/views/generic/edit.py" in get_context_data
  93.             kwargs['form'] = self.get_form()

File "/usr/local/lib/python3.6/site-packages/django/views/generic/edit.py" in get_form
  45.         return form_class(**self.get_form_kwargs())

Exception Type: TypeError at /sites/site/add_subnet/7
Exception Value: 'SubnetForm' object is not callable

我不确定为什么,因为至少在我不熟练的眼睛看来,表单的代码看起来不错

表单.py:

class SubnetForm(forms.ModelForm):
    class Meta:
        model = SiteSubnets
        fields = ['subnet', 'subnet_type', 'circuit', 'device_data', 'vlan_id', 'peer_desc']

    def __init__(self, *args, **kwargs):
        site_id = kwargs.pop('site_id', None)
        self.is_add = kwargs.pop("is_add", False)
        super(SubnetForm, self).__init__(*args, **kwargs)
        self.fields['circuit'].queryset = Circuits.objects.filter(site_data=site_id)
        self.helper = FormHelper(self)
        self.helper.form_id = 'subnet_form'
        self.helper.form_method = 'POST'
        self.helper.add_input(Submit('submit', 'Add Subnet' if self.is_add else 'Edit Subnet', css_class='btn-primary'))
        self.helper.layout = Layout(
            Div(    
                Div(
                    Field('subnet', placeholder='Subnet'),
                    Div('subnet_type', title="Subnet Type"),
                    css_class='col-lg-3'
                ),
                Div(
                    Div('circuit', title='Circuit'),
                    Div('device_data', title="Device Data"),
                    css_class='col-lg-3'
                ),
                Div(
                    Field('vlan_id', placeholder='VLAN ID'),
                    Field('peer_desc', placeholder="Peer Description"),
                    css_class='col-lg-3'
                ),
            css_class='row'
            )
        )

浏览次数:

class AddSubnet(CreateView):
    form_class = SubnetForm(is_add=True)
    template_name = "sites/subnet_form.html"

    @method_decorator(user_passes_test(lambda u: u.has_perm('config.add_subnet')))
    def dispatch(self, *args, **kwargs):
        self.site_id = self.kwargs['site_id']
        self.site = get_object_or_404(SiteData, pk=self.site_id) 
        return super(AddSubnet, self).dispatch(*args, **kwargs)

    def get_success_url(self, **kwargs):         
            return reverse_lazy("sites:site_detail_subnets", args=(self.site_id,))

    def form_valid(self, form):
        form.instance.site_data = self.site
        return super(AddSubnet, self).form_valid(form)

    def get_form_kwargs(self, *args, **kwargs):
        kwargs = super().get_form_kwargs()
        kwargs['site_id'] = self.site_id
        return kwargs

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['SiteID']=self.site_id
        context['SiteName']=self.site.location
        context['FormType']='Add'
        context['active_subnets']='class="active"'

        return context

class EditSubnet(UpdateView):
    model = SiteSubnets
    form_class = SubnetForm
    template_name = "sites/subnet_form.html"

    @method_decorator(user_passes_test(lambda u: u.has_perm('config.edit_subnet')))
    def dispatch(self, *args, **kwargs):
        self.site_id = self.kwargs['site_id']
        self.site = get_object_or_404(SiteData, pk=self.site_id) 
        return super(EditSubnet, self).dispatch(*args, **kwargs)

    def get_success_url(self, **kwargs):         
            return reverse_lazy("sites:site_detail_subnets", args=(self.site_id,))

    def form_valid(self, form):
        form.instance.site_data = self.object.site_data
        return super(EditSubnet, self).form_valid(form)

    def get_form_kwargs(self, *args, **kwargs):
        kwargs = super().get_form_kwargs()
        return kwargs

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['SiteID']=self.site_id
        context['SiteName']=self.site.location
        context['FormType']='Edit'
        context['active_subnets']='class="active"'

        return context

最佳答案

这就是罪魁祸首:form_class = SubnetForm(is_add=True)form_class 应该是名称所表示的,只是 class,而不是实例。使用 get_form_kwargs 将初始化参数添加到表单构造函数调用中(就像您对 site_id 所做的那样):

class AddSubnet(CreateView):
    form_class = SubnetForm   # just the form CLASS
    # ...

    def get_form_kwargs(self, *args, **kwargs):
        kwargs = super().get_form_kwargs()
        kwargs['is_add'] = True  # you can set 'is_add' here
        kwargs['site_id'] = self.site_id
        return kwargs

关于python - Django Update 和 CreateView 使用相同的 Crispy Form,添加 View 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48626645/

相关文章:

python - 通过内省(introspection)行的每个元素来过滤 pandas 数据框

python - 有没有办法测试数据 X 和二进制输出 Y 之间的相关性?

python - 使用 Python 过滤垃圾邮件

Django:使用基于类的 View 根据对象的属性进行身份验证

python - Django更改表单字段错误消息

Python 素数代码在 spoj 上给出运行时错误(NZEC)

python:异常流程:捕获后继续向下捕获 block ?

django - 如何使用 django 基于日期的通用 View

Django编程培训类(class)

Django 用户模型,添加功能