Django CBV get url变量用于类中,未定义错误self s

2024-09-30 14:15:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在传递并尝试在我的add表单中使用site\u id。我想用url中的站点ID预填充和隐藏站点数据字段。然后使用该变量向上下文传递更多信息。你知道吗

我的CBV是这样的:

class AddSubnet(CreateView):
    model = SiteSubnets
    template_name = "sites/edit_subnet.html"
    fields = ['device_data', 'site_data', 'subnet', 'subnet_type', 'circuit', 'vlan_id', 'peer_desc']
    site_id = self.kwargs['site_id']
    site = get_object_or_404(SiteData, pk=site_id) 

    @method_decorator(user_passes_test(lambda u: u.has_perm('config.add_subnet')))
    def dispatch(self, *args, **kwargs):
        return super(AddSubnet, self).dispatch(*args, **kwargs)

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

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        context['SiteID']=site_id
        context['SiteName']=site.location
        context['active_subnets']='class="active"'
        #
        return context

目前产生的结果是:

  File "/itapp/itapp/sites/urls.py", line 2, in <module>
    from . import views
  File "/itapp/itapp/sites/views.py", line 984, in <module>
    class AddSubnet(CreateView):
  File "/itapp/itapp/sites/views.py", line 988, in AddSubnet
    site_id = self.kwargs['site_id']
NameError: name 'self' is not defined

编辑:

url就是这样的

url(r'^site/add_subnet/(?P<site_id>[0-9]+)$', views.AddSubnet.as_view(), name='add_subnet'),

Tags: selfaddidurldatagetcontextsite
2条回答

您编写的语法无效。从代码中删除以下两行

site_id = self.kwargs['site_id']
site = get_object_or_404(SiteData, pk=site_id)

用方法get_context_data

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

在类定义中不能像这样访问self。此代码在加载模块时运行。还没有请求,因此self.kwargs不存在。你知道吗

您可以将代码移到dispatch方法中:

@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)

然后在其他方法中使用self.site_idself.site。你知道吗

相关问题 更多 >

    热门问题