use*_*589 18 django django-class-based-views
如何get_context_data从CVB DetailView中获取'pk'或'id' ?
class MyDetail(DetailView):
model = Book
template_name = 'book.html'
def get_context_data(self, **kwargs):
context = super(MyDetail, self).get_context_data(**kwargs)
context['something'] = Book.objects.filter(pk=pk)
return context
Run Code Online (Sandbox Code Playgroud)
网址:
url(r'^book/(?P<pk>\d+)/$', MyDetail.as_view(), name='book'),
Run Code Online (Sandbox Code Playgroud)
class MyDetail(DetailView):
model = Book
template_name = 'book.html'
def get_context_data(self, **kwargs):
context = super(MyDetail, self).get_context_data(**kwargs)
context['something'] =Book.objects.filter(pk=self.kwargs.get('pk'))
return context
Run Code Online (Sandbox Code Playgroud)
self.kwargs['pk'] 它在 Django 2.2 中不起作用
在详细视图中
self.object 是此视图正在显示的对象。
因此,要访问对象的字段,例如
id或pk只是self.object.id或self.object.pk
所以,Django 2.2 中的答案可能是这样的:
class MyDetail(DetailView):
model = Book
template_name = 'book.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['something'] = Book.objects.filter(pk=self.object.pk) # <<<---
return context
Run Code Online (Sandbox Code Playgroud)
在 get_context_data 中,您已经在 self.object 中拥有该对象(并且您可以执行 self.object.pk )。以下是类层次结构上游发生的情况(DetailView 继承自 BaseDetailView):
class BaseDetailView(SingleObjectMixin, View):
"""
A base view for displaying a single object
"""
def get(self, request, *args, **kwargs):
self.object = self.get_object()
context = self.get_context_data(object=self.object)
return self.render_to_response(context)
Run Code Online (Sandbox Code Playgroud)
阅读 Django 源代码来理解内容非常容易。
顺便说一句,我不确定你是否总是可以信赖 kwargs 有一个“pk”密钥这一事实。
| 归档时间: |
|
| 查看次数: |
19396 次 |
| 最近记录: |