Представление списка в Django неоднократно терпит неудачу, но детальные страницы работают
testt1 это мое представление для получения набора запросов и создания списка объектов и их дочерних внешних ключей.
mydetail это детальное представление для отдельных объектов. В списке не используется slug, но он есть в шаблоне списка для вызова страниц детализации. Но все эти ошибки возникают при попытке вызвать список, а не деталь. Если я просто ввожу slug в адресную строку, все мои детальные страницы открываются просто отлично!
Я пробовал много разных вещей, и получаю множество различных ошибок, но итог всегда один и тот же: нет списка
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})
- 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 одинаковый.
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/
- 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?
- 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.