我需要帮助来理解我自己的代码,尤其是views.py。我正在尝试通过使用Update模型的title字段而不是使用slug字段来更改TitleUpdateListView的url模式。
如果有人可以帮助我逐行解释TitleUpdateListView中发生的情况,那么我可以更好地理解具体发生的情况,那将是很好的。
urls.py
urlpatterns = [
# Update view for each game
path('<str:title>/updates/', TitleUpdateListView.as_view(), name='title-updates'),
# Adds the ability to sort by platform
path('<str:title>/updates/<int:platform_id>/', TitleUpdateAjaxListView.as_view(), name='title-updates-ajax'),
]
views.py
class TitleUpdateListView(ListView):
model = Update
context_object_name = 'updates'
template_name = 'updates/title_updates.html'
def get_queryset(self):
title = get_object_or_404(Game, title=self.kwargs.get('title'))
return Update.objects.filter(game=title).order_by('-date_published')
def get_context_data(self, **kwargs):
context = super(TitleUpdateListView, self).get_context_data(**kwargs)
context['game'] = get_object_or_404(Game, title=self.kwargs.get('title'))
return context
class TitleUpdateAjaxListView(ListView):
model = Update
template_name = 'updates/updates_ajax.html'
context_object_name = 'updates'
paginate_by = 5
def get_queryset(self):
title = get_object_or_404(Game, title=self.kwargs.get('title'))
return Update.objects.filter(game=title, platform=Platform.objects.filter(
id=self.kwargs.get('platform_id')).first()).order_by('-date_published')
def get_context_data(self, **kwargs):
context = super(TitleUpdateAjaxListView, self).get_context_data(**kwargs)
context['game'] = get_object_or_404(Game, title=self.kwargs.get('title'))
return context
def get(self, request, *args, **kwargs):
self.object_list = self.get_queryset()
context = self.get_context_data()
return render(request, self.template_name, context)
答案 0 :(得分:1)
不确定“我正在尝试通过使用更新模型标题字段而不是使用子弹字段更改TitleUpdateListView的URL模式”的意思。在urls.py中,您可以将参数的名称(<str:xxxx>
中的xxxx)更改为所需的名称,只要您还在视图中查找相同的名称即可。您可以将其更改为<str:slug>
,并在您看来像self.kwargs.get('slug')
一样获取它。只需记住还要更改用于过滤Game
表(slug
而不是title
)的参数。
关于解释您的视图的用途,您可能应该看一下Django的基于类的视图的文档,但我将尝试给出一个概述:
get_queryset
方法正在搜索Game
表,以查找标题与URL参数中传递的标题匹配的游戏。然后,它返回其Update
字段指向刚刚找到的游戏的所有game
对象的列表。
在get_context_data
键下,Game
方法将在get_queryset
方法中找到的相同'game'
对象添加到视图的上下文中。这意味着您可以访问此视图呈现的模板内的Game
对象。
答案 1 :(得分:1)
您只需要更改视图的get_queryset
方法:
# change url variable name from title to slug
path('<str:slug>/updates/', TitleUpdateListView.as_view(), name='title-updates'),
def get_queryset(self):
# the url variables are stored in the dictionary self.kwargs
slug = self.kwargs.get('slug')
game = get_object_or_404(Game, slug=slug)
return Update.objects.filter(game=game).order_by('-date_published')
get_context_data
也是如此:
def get_context_data(self, **kwargs):
context = super(TitleUpdateListView, self).get_context_data(**kwargs)
context['game'] = get_object_or_404(Game, slug=self.kwargs.get('slug'))
return context