回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我正在尝试过滤一个表单外键,如本文<a href="https://stackoverflow.com/questions/43846588/set-variable-into-queryset-of-forms-py-from-my-generic-view-or-url/43847721#43847721">set variable into queryset of forms.py from my generic view or url</a></p>
<p>但是我得到了错误</p>
<pre><code>'AddSubnet' object has no attribute 'kwargs'
</code></pre>
<p>当我删除def<strong>init</strong>函数时,问题就解决了。所以我知道它肯定和这个函数有关,但我不确定是什么。在</p>
<p>完整跟踪:</p>
^{pr2}$
<p>在视图.py以下内容:</p>
<pre><code>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
</code></pre>
<p>编辑:</p>
<p>我现在的状态是这样的</p>
<pre><code>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)
</code></pre>
<p>我的观点是:</p>
<pre><code>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
</code></pre>
<p>我也犯了同样的错误但是表单.py现在</p>
<pre><code>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'
</code></pre>