Как определить слаг другой модели в myListView - PullRequest
0 голосов
/ 16 марта 2019

Мне нужна помощь в понимании моего собственного кода, в частности views.py.Я пытаюсь изменить шаблон URL для моего TitleUpdateListView, используя поле заголовка Обновление моделей и вместо этого используя поле slug.

Если бы кто-то мог помочь построчно объяснить, что происходит в моем 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 ]

1 голос
/ 16 марта 2019

Вам просто нужно изменить 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
1 голос
/ 16 марта 2019

Не уверен, что вы имели в виду под "Я пытаюсь изменить шаблон URL для моего TitleUpdateListView, не используя поле заголовка моего Обновления моделей, а вместо этого используя вместо этого поле слаг".В файле urls.py вы можете изменить имя параметра (xxxx в <str: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 внутри шаблона, который отображается в этом представлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...