我想獲取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壓倒了?
感謝您的幫助!