【发布时间】:2018-02-17 12:51:24
【问题描述】:
我想获取 Sample 的项目名称。它应该在 self.args 中,因为我的 urls.py 看起来像那样(有很多 url,所以我只会发布重要的):
项目/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/urls.py
app_name="robjects"
urlpatterns = [
...
url(r'^(?P<pk>[0-9]+)/samples/', include("samples.urls")),
]
samples/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,即 projects/urls.py 的 '(\w+)' 部分。为此,我在 samples/views.py 中编写了该代码。我试图做 project_name = self.args[0] 但我的 args 是空的。
类 SampleListView(ListView): 型号 = 样品 template_name = "samples/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'}
我想通过 robject_id 和 project_name 过滤我的 qs,对于 robject_id 它工作正常。我不知道如何获取 project_name 进行过滤。
此外,我不得不说,在标签中(“网址中不包含”)我使用 self.argss[0] 完成了它,它有效,但仅形成标签列表视图。
代码如下:
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'),
一切正常。在我的 args 中是 project_name,我可以通过 self.args[0]
捕获它但是当我添加到我的参数为空时,
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 错误还是有什么方法可以使用 self.args ?它们被 kwargs 覆盖了吗?
感谢您的帮助!
【问题讨论】:
标签: python django listview django-views django-class-based-views