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時。