Python Django-init对象没有属性';kwargs';

Python Django-init对象没有属性';kwargs';,python,django,Python,Django,我正在尝试过滤一个表单外键,就像在这篇文章中一样 然而,我得到的错误 'AddSubnet' object has no attribute 'kwargs' 当我删除definit功能时,问题就解决了。所以我知道这肯定与这个函数有关,但我不确定是什么 完整跟踪: Traceback: File "/usr/local/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner 41.

我正在尝试过滤一个表单外键,就像在这篇文章中一样

然而,我得到的错误

'AddSubnet' object has no attribute 'kwargs'
当我删除definit功能时,问题就解决了。所以我知道这肯定与这个函数有关,但我不确定是什么

完整跟踪:

Traceback:

File "/usr/local/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
  41.             response = get_response(request)

File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py" in _legacy_get_response
  249.             response = self._get_response(request)

File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
  187.                 response = self.process_exception_by_middleware(e, request)

File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
  185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/usr/local/lib/python3.6/site-packages/django/views/generic/base.py" in view
  62.             self = cls(**initkwargs)

File "/itapp/itapp/sites/views.py" in __init__
  1001.         site_id = self.kwargs['site_id']

Exception Type: AttributeError at /sites/site/add_subnet/7
Exception Value: 'AddSubnet' object has no attribute 'kwargs'
views.py:

class AddSubnet(CreateView):
    model = SiteSubnets
    template_name = "sites/edit_subnet.html"
    fields = ['device_data', 'subnet', 'subnet_type', 'circuit', 'vlan_id', 'peer_desc']
    exclude = ['site_data'] 

    @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.kwargs['site_id'],))

    def __init__(self, *args, **kwargs):
        #site_id = kwargs.pop('site_id')
        site_id = self.kwargs['site_id']
        self.fields['circuit'].queryset = Circuits.objects.filter(site_data=site_id)

    def get_form_kwargs(self, *args, **kwargs):
        kwargs = super(AddSubnet, self).get_form_kwargs()
        if kwargs['instance'] is None:
            kwargs['instance'] = SiteSubnets()
            kwargs['instance'].site_data = site = get_object_or_404(SiteData, pk=self.kwargs['site_id'])
            kwargs['site_id'] = self.kwargs['site_id']
        return kwargs

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

        return context
编辑:

我的表格现在看起来像这样

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

    def __init__(self, *args, **kwargs):
        site_id = self.kwargs.pop('site_id', None)
        super(AddSubnetForm, self).__init__(*arg)
        self.fields['circuit'].queryset = Circuits.objects.filter(site_data=site_id)
我的观点是:

class AddSubnet(CreateView):
    form_class = AddSubnetForm
    template_name = "sites/edit_subnet.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.kwargs['site_id'],))

    def get_form_kwargs(self, *args, **kwargs):
        kwargs = super(AddSubnet, self).get_form_kwargs()
        if kwargs['instance'] is None:
            kwargs['instance'] = SiteSubnets()
            kwargs['instance'].site_data = site = get_object_or_404(SiteData, pk=self.kwargs['site_id'])
            kwargs['site_id'] = self.kwargs['site_id']
        return kwargs

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

        return context
我得到了同样的错误,但现在是forms.py

File "/itapp/itapp/sites/forms.py" in __init__
  199.         site_id = self.kwargs.pop('site_id', None)

Exception Type: AttributeError at /sites/site/add_subnet/7
Exception Value: 'AddSubnetForm' object has no attribute 'kwargs'

您尚未定义self.kwargs,因此它不存在

self.site_id = self.kwargs['site_id']
应该是

self.site_id = kwargs['site_id']

您尚未定义self.kwargs,因此它不存在

self.site_id = self.kwargs['site_id']
应该是

self.site_id = kwargs['site_id']

决不应覆盖视图上的
\uuuu init\uuu
方法

但是看看你的代码,看起来你实际上是想把这个-和
字段
属性-放在表单上,而不是视图上

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

    def __init__(self, *args, **kwargs):
        site_id = kwargs.pop('site_id', None)
        super(AddSubnetForm, self).__init__(*arg
        self.fields['circuit'].queryset = Circuits.objects.filter(site_data=site_id)

class AddSubnet(CreateView):
    form_class = AddSubnetForm

(请注意,这是Alasdair在链接答案中所做的。)

您不应该覆盖视图上的
\uuuu init\uuuu
方法

但是看看你的代码,看起来你实际上是想把这个-和
字段
属性-放在表单上,而不是视图上

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

    def __init__(self, *args, **kwargs):
        site_id = kwargs.pop('site_id', None)
        super(AddSubnetForm, self).__init__(*arg
        self.fields['circuit'].queryset = Circuits.objects.filter(site_data=site_id)

class AddSubnet(CreateView):
    form_class = AddSubnetForm

(请注意,这是Alasdair在链接答案中所做的。)

首先,尝试使用kwargs=super(AddSubnet,self)。首先,尝试使用kwargs=super(AddSubnet,self)。获取表格kwargs(*args,**kwargs)所以我所有的函数都应该在表单中,而不是视图中?我仍然得到了相同的错误,但是在表单初始的站点id行上,iv用新的代码更新了问题。抱歉,应该是
kwargs
而不是
self.kwargs
,更新了,谢谢我所有的函数都应该在表单中,而不是视图中?我仍然收到相同的错误,但是在表单初始的站点id行上,iv用新的代码更新了问题抱歉,应该是
kwargs
而不是
self.kwargs
,更新了。这样做了,谢谢