#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