Единственная проблема с этим подходом состоит в том, что если вы не укажете slug
, то представление вызывается с slug=None
, и, следовательно, вы фильтруете с помощью slug=None
, что приведет к сбою.
Вы можете решить это с помощью проверки None
:
def activity_detail(request, year, slug=None):
filter = {'year': year}
if <b>slug is not None</b>:
filter['slug'] = slug
activity = get_object_or_404(Activity, <b>**filter</b>)
context = {
'activity': activity,
}
return render(request, "activity/detail.html", context)
Итак, здесь мы сначала создаем начальный словарь filter
, который содержит только year
, и если slug
не None
, затем мы добавляем дополнительный фильтр.
Я нахожу, однако, фильтр year
довольно странным: обычно для данного year
будет кратно Activity
с, поэтомубудет ошибка.
В случае, если вы получите ошибку, такую как:
Нет, активность соответствует данному запросу.
Таким образом, это означает, что нет запись в ваших базах данных за данный год и слаг.Ошибка 404 не является проблемой: она просто говорит, что для данного заданного URL-адреса нет соответствующего Activity
доступного объекта.Поэтому имеет смысл вернуть такую ошибку.
Если вы хотите отобразить все Activity
с, которые соответствуют фильтру, вы можете использовать get_list_or_404
[Джанго-док] .