Django url Нет активность соответствует заданному запросу? - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь написать поле slug, чтобы пользователи могли просматривать мою activity_detail страницу.Я думаю, что написал правильный код, но получаю ошибку 404 с No Activity matches the given query. .Вот мой код:

my urls.py

from django.urls import re_path
from . views import activity_list, activity_detail, activity_index

app_name = 'activity'

urlpatterns = [
re_path(r'^$', activity_index, name='index'),
re_path(r'^(?P<year>[0-9]{4})/$', activity_list, name='list'),
re_path(r'^(?P<year>[0-9]{4})/(?P<slug>[\w-]+)/$', activity_detail, name='detail'),
]

my views.py:

def activity_detail(request, year, slug=None):
    activity = get_object_or_404(Activity, year=year, slug=slug)
    context = {
    'activity': activity,
    }
    return render(request, "activity/detail.html", context)

Я планирую позвонить по своим URL-адресам из браузераследующим образом:

http://localhost/activity/
http://localhost/activity/2018/
http://localhost/activity/2018/myactivity

1 Ответ

0 голосов
/ 01 октября 2018

Единственная проблема с этим подходом состоит в том, что если вы не укажете 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 [Джанго-док] .

...