我正在将一些基于函数的视图转换为基于类的视图,以使我的视图更具可读性。但是我不太了解它的使用DetailView
以及如何将它实际集成到我的代码中以便将 a 传递slug
到我的函数中。
现在,我正在使用View
并将其传递slug
到我的函数中,如下所示:
#urls.py
path('preview/<slug:slug>/', views.Preview.as_view(), name='toPreview')
#views.py
@method_decorator(auth0_login_required, name='dispatch')
class Preview(View):
template_name = 'authenticated/preview.html'
@card_is_chosen
def get(self, slug, request, *args, **kwargs):
person = get_object_or_404(Person, slug=slug, status=True)
...
return render(request, self.template_name, {...})
我也不太确定这是否是最佳实践,以防万一 DetailView 提供什么?
编辑:尝试使用评论中提到的 DetailView,我该如何解决此错误?
#urls.py
path('preview/<slug:slug>/', views.Preview.as_view(), name='toPreview')
#views.py
@method_decorator(auth0_login_required, name='dispatch')
class Preview(DetailView):
model = Person
template_name = 'preview.html'
@card_is_chosen
def get(self, request, *args, **kwargs):
print(slug)
#slug is not defined, how should I fetch slug parameter?
...
return render(request, self.template_name, {...})
追溯:
File "C:\Users\...\Desktop\env\src\...\apps\businesscards\decorators.py", line 60, in wrap
return function(self, request, slug, *args, **kwargs)
File "C:\Users\...\Desktop\env\src\...\apps\businesscards\views.py", line 160, in get
person = get_object_or_404(Person, slug=slug, status=True)
NameError: name 'slug' is not defined
由于您的 slug 字段被称为slug
,您只需要在详细信息视图中指定model
和template_name
。详细视图将负责获取带有该 slug 的人。
from django.views.generic import DetailView
@method_decorator([auth0_login_required, card_is_chosen] name='dispatch')
class PersonDetailView(DetailView):
model = Person
template_name = 'authenticated/preview.html'
def get_context_data(self, **kwargs):
"""
get_context_data is one of the important hooks in generic class
based views. It lets you add extra variables to the template context
"""
context = super(PersonDetailView, self).get_context_data(**kwargs)
context['extra'] = 'extra value'
return context
在上面,我假设可以dispatch
用card_is_chosen
. 如果不是这种情况,您可以添加method_decorator(card_is_chosen, name='get')
。我添加了一个get_context_data
- 上面的代码不需要它,但它可能对...
您未显示的问题中的某些代码有用。
如果您要覆盖该get
方法,我将使用通常的签名def get(self, request, *args, **kwargs):
然后获取 slug forself.kwargs
def get(self, request, *args, **kwargs):
slug = self.kwargs['slug']
您通常应该避免覆盖get
和post
通用的基于类的视图。您可能会失去功能或不得不重复代码。通常有更具体的属性或方法可以覆盖。
最后,不要认为基于类的视图总是更好。就我个人而言,我会发现以下基于函数的视图比您的视图更容易阅读Preview
。
@auth0_login_required
@card_is_chosen
def person(request, slug):
person = get_object_or_404(Person, slug=slug, status=True)
template_name = 'authenticated/preview.html'
...
return render(request, template_name, {...})
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句