Как определить slug другой модели в MyListView

#django

#django

Вопрос:

Мне вроде как нужна помощь в понимании моего собственного кода, в частности 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)
  

Комментарии:

1. Из вашего вопроса можно было бы предположить, что вы действительно хотели понять, что происходит в коде, но из выбранного ответа кажется, что вы просто хотели правильный код, в конце концов. С этим проблем нет, но в будущем постарайтесь говорить об этом прямо с самого начала, чтобы вы быстрее получили свой ответ и никто не тратил время на написание материала, который вам на самом деле не нужен.

2. Это моя ошибка, извините. Я только что понял, что вы не можете отметить несколько правильных ответов. Я изначально отметил ваш, а затем отметил других пользователей.

Ответ №1:

Не уверен, что вы имели в виду, говоря «Я пытаюсь изменить шаблон URL для моего TitleUpdateListView с использования поля заголовка моих моделей обновления и вместо этого использовать поле slug вместо.». В urls.py вы можете изменить имя параметра (xxxx в <str:xxxx> ) на любое, какое захотите, при условии, что вы также ищете это же имя в представлении. Вы можете изменить его на <str:slug> и, по вашему мнению, вы бы извлекли его следующим образом self.kwargs.get('slug') . Просто не забудьте также изменить, какой параметр вы используете для фильтрации Game таблицы ( slug вместо title ).

Что касается объяснения того, что делает ваш view, вам, вероятно, следует взглянуть на документы Django по представлениям на основе классов, но я постараюсь дать общий обзор:

get_queryset Метод заключается в поиске в Game таблице игр, название которых соответствует названию, переданному в параметре URL. Затем он возвращает список всех Update объектов, поле game которых указывает на только что найденную игру.

get_context_data Метод добавляет тот же Game объект, найденный в get_queryset методе, в контекст представления под 'game' ключом. Это означает, что вы можете получить доступ к Game объекту внутри шаблона, который отображает это представление.

Ответ №2:

Вам просто нужно изменить 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