如何在myListView中定义另一个模型的子弹

时间:2019-03-16 18:32:55

标签: django

我需要帮助来理解我自己的代码,尤其是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)

2 个答案:

答案 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