Представление списка в Django неоднократно терпит неудачу, но детальные страницы работают

testt1 это мое представление для получения набора запросов и создания списка объектов и их дочерних внешних ключей.

mydetail это детальное представление для отдельных объектов. В списке не используется slug, но он есть в шаблоне списка для вызова страниц детализации. Но все эти ошибки возникают при попытке вызвать список, а не деталь. Если я просто ввожу slug в адресную строку, все мои детальные страницы открываются просто отлично!

Я пробовал много разных вещей, и получаю множество различных ошибок, но итог всегда один и тот же: нет списка

  1. named url fails

    Error during template rendering In template /home/malikarumi/Projects/hattie/templates/base.html, error at line 44 Reverse for 'jhp_url' not found. 'jhp_url' is not a valid view function or pattern name.

'jhp_url' - это именованный url для страницы detail.

Но вот строка 44:

<link href="{% static 'plugins/owl-carousel/owl.carousel.css' %}" rel="stylesheet">

urlpattern:

path('<slug:slug>/', mydetail, name='jhp_url'),

вызов функции reverse():

def get_absolute_url(self):
    return reverse(‘jhp_url', kwargs={'slug': self.slug})
  1. namespaced url fails

Ошибка во время рендеринга шаблона В шаблоне /home/malikarumi/Projects/hattie/templates/base.html ошибка в строке 44 Reverse for 'jhp_url' with keyword arguments '{'slug': ''}'' not found. Проверен 1 шаблон(ы): ['(?P[^/]+)/courts/(?P[-a-zA-Z0-9_]+)/$']

Теперь у него пустая строка для slug. Шаблон правильный. Если бы у него был slug, он бы сработал.

def get_absolute_url(self):
    return reverse('bench:jhp_url', kwargs={'slug': self.slug})

Шаблон списка:

<h3><a href="{% url 'bench:jhp_url' slug=C.slug %}">{{ C.name }}</a></h3>

urlpattern одинаковый.

  1. no slug passed

    testt1() missing 1 required positional argument: 'slug'

Что означает, что, как я сейчас определил:

def testt1(request, slug, *args, **kwargs):
print(request.slug)

Не предоставляется переменная/значение slug. Теперь это также может быть вопросом позиции, поэтому я изменил только это:

def testt1(request, *args, **kwargs):

Но поскольку slug все еще находится в возвращаемом значении, теперь я получаю: Unresolved reference 'slug'

Я вынимаю его, и автозарядка просыпается...

У объекта 'WSGIRequest' нет атрибута 'slug'

Да, ну, это то, что я подозревал. Поэтому я и поставил там печать. Вопрос в следующем: почему у него нет слизняков?

https://docs.djangoproject.com/en/3.2/topics/http/urls/#including-other-urlconfs. Всякий раз, когда Django встречает include(), он отрезает любую часть URL, соответствующую этому моменту, и отправляет оставшуюся строку в URLconf для дальнейшей обработки.

Очевидно, я не понимаю этот процесс, потому что я всегда полагал, что это означает, что часть slug моего url передается как часть объекта запроса. Но теперь я вижу, что слово 'slug' не появляется в документации на странице запроса ответа: https://docs.djangoproject.com/en/dev/ref/request-response/

  1. extra arguments fail

В документации также есть возможность передачи "дополнительных аргументов": https://docs.djangoproject.com/en/3.2/topics/http/urls/#passing-extra-options-to-include. https://docs.djangoproject.com/en/3.2/topics/http/urls/#passing-extra-options-to-view-functions

Но здесь сказано ничего об использовании дополнительных аргументов в сочетании с именованными или даже разделенными по именам урлами. Значит ли это, что они не сочетаются или не могут сочетаться? Тогда не должны ли они сказать об этом явно, как в дзен Python? В любом случае, все мои усилия в этой области потерпели фиаско:

File "/home/malikarumi/Projects/hattie/bench/urls.py", line 13
path('<slug:slug>', mydetail, name='jhp_url', {'slug': slug}),
                                              ^

SyntaxError: позиционный аргумент следует за аргументом ключевого слова

Говорят ли они, что словарь - это позиционный аргумент, а не ключевое слово?

File "/home/malikarumi/Projects/hattie/bench/urls.py", line 14, in <module>
path('', testt1, slug='slug', name='testt1'),
TypeError: _path() got an unexpected keyword argument 'slug'

File "/home/malikarumi/Projects/hattie/bench/urls.py", line 13, in <module>
path('<slug:slug>', mydetail, slug='slug', name='jhp_url'),
TypeError: _path() got an unexpected keyword argument 'slug'

File "/home/malikarumi/Projects/hattie/bench/urls.py", line 13, in <module>
path('<slug:slug>', mydetail, name='jhp_url', slug=slug),
NameError: name 'slug' is not defined

Это не так? Тогда что такое 'slug:slug'???

Очевидно, что slug не передается. Если это не происходит автоматически, и это не является частью объекта запроса - несмотря на slug:slug в urlpattern, и я не могу использовать эти дополнительные аргументы, как я могу получить передать slug?

  1. explicit slug keyword argument in view fails:
File "/home/malikarumi/Projects/hattie/bench/views.py", line 22
        def testt1(request, *args, '<slug:slug>', **kwargs):
                                   ^
        SyntaxError: invalid syntax

На всякий случай, если вам интересно, да, я пробовал явно передавать slug как ключевое слово. Все попытки не увенчались успехом.

def testt1(request, slug=slug, **kwargs):

неразрешенная ссылка slug

def testt1(request, slug=self.slug, **kwargs):

неразрешенная ссылка self

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

То, как я бы написал ваши представления и урлы, выглядит следующим образом:

# views.py

def mydetail(request, slug):
    ...


def testt1(request):
    ...


# urls.py

app_name = 'bench'
urlpatterns = [
    path('<slug:slug>/', mydetail, name='jhp_url'),
    path('/', testt1, name='testt1'),
]

Полные имена url для них будут следующими:

  • bench:jhp_url
  • bench:testt1

Если вы используете что-то вроде:

<h3><a href="{% url 'bench:jhp_url' slug=C.slug %}">{{ C.name }}</a></h3>

И он все еще выдает ошибку Reverse for 'jhp_url' with keyword arguments '{'slug': ''}' not found., тогда проблема в том, что C.slug разрешается в пустую строку или None, или C является None.

Вернуться на верх