1

我想获取Sample的项目名称。它应该是self.args因为我的urls.py看起来像这样(有很多网址,所以我将只发布重要的):Django在ListView中为空self.args时<pk>在urls.py

项目/ urls.py

app_name = 'projects' 
urlpatterns = [ 
    url(r"^$", ProjectListView.as_view(), name="projects_list"), 
    url(r"^(\w+)/robjects/", include("robjects.urls")), 
    url(r"^(\w+)/tags/$", TagsListView.as_view(), name="tag_list"), 
... 
] 

robjects /网址的.py

app_name="robjects" 
urlpatterns = [ 
... 
    url(r'^(?P<pk>[0-9]+)/samples/', include("samples.urls")), 
] 

样品/ urls.py

app_name="samples" 
urlpatterns = [ 
    url(r'^list/$', SampleListView.as_view(), name='sample_list_view'), 
    url(r'^create/$', SampleCreateView.as_view(), name='sample_create_view'), 
    url(r'^(?P<sample_id>[0-9]+)/update/$', SampleUpdateView.as_view(), name='sample_update'), 
    url(r'^(?P<sample_id>[0-9]+)/delete/$', SampleDeleteView.as_view(), name='sample_delete'), 
] 

我想PROJECT_NAME,这是幻灯的 '(\ w +)' 的一部分CTS/urls.py。为此,我在samples/views.py中编写了该代码。我试图做project_name = self.args [0]但我的参数是空的。

类SampleListView(ListView控件): 模型=样品 TEMPLATE_NAME = “样品/ samples_list.html”

def get(self, request, *args, **kwargs): 
     """A base view for displaying a list of objects.""" 
     # check if project exists 
     try: 
      pk = kwargs['pk'] 
      robject = Robject.objects.get(id=pk) 
      # add project to view attributes 
      self.robject = robject 
     except Robject.DoesNotExist: 
      raise Http404 
     print(self.args) # it should be a project name here 
     return super(SampleListView, self).get(request, *args, **kwargs) 

    def get_queryset(self, *args, **kwargs): 
     """ 
     Overwrite orginal qs and add filtering by robject 
     """ 

     # original queryset 
     qs = super().get_queryset(*args, **kwargs) 
     print('args, ',self.args) 
     print('kwargs', self.kwargs) 
     pk = self.kwargs['pk'] 
     robject = Robject.objects.get(id=pk) 
     return qs.filter(robject=self.robject) 

这是输出:

args, () 
kwargs {'pk': '27'} 

我想要筛选我的QS robject_id和通过project_name,为robject_id它工作正常。我不知道如何获取project_name进行过滤。

此外,我不得不说,在标签(“不包括在urls”)我做了self.argss [0],它的工作原理,但只是形成标签ListView。下面

代码:

class TagsListView(LoginRequiredMixin, ListView): 
    model = Tag 
    template_name = "tags/tag_list.html" 

    def get(self, request, *args, **kwargs): 
     """A base view for displaying a list of objects.""" 
     # check if project exists 
     try: 
      project = Project.objects.get(name=args[0]) # it works fine 
      # add project to view attributes 
      self.project = project 
     except Project.DoesNotExist: 
      raise Http404 
     return super(TagsListView, self).get(request,*args, **kwargs) 

这是我发现:

当我定义我的网址这样的:

url(r"^(\w+)/robjects/samples/$", SampleListView.as_view(), name='sample_list_view'), 

所有worrks。在我的参数表是PROJECT_NAME,我可以通过self.args抓住它[0]

但当我添加到我的ARG游戏空,

url(r"^(\w+)/robjects/(?P<pk>[0-9]+)/samples/$", SampleListView.as_view(), name='sample_list_view'), 

当我定义了两个kwargs像这样的:

url(r"^(?P<project_name>[\w\-]+)/robjects/(?P<pk>[0-9]+)/samples/list/$",SampleListView.as_view(), name='sample_list_view'), 

ARGS空 - 我所期待的,kwargs都是确定并传递给视图

它是Django的bug还是有任何方式使用self.args?他们是否被kwargs压倒了?

感谢您的帮助!

回答

0

这看起来像一个错误。我测试了它,当你通过指定参数和kwargs到您的网址,如:

url(r"^(\w+)/test1/(?P<pk>[0-9]+)/test2/$", TestListView.as_view(), name='list_view'), 

然后ListView控件返回ARGS空的元组(它不应该)。 它只适用于当你只传递参数或者只传入url时。