Я пытаюсь направить все неизвестные URL-адреса в одно представление. Однако при этом мои известные URL-адреса работают только тогда, когда у них нет завершающей косой черты, несмотря на то, что для APPEND_SLASH установлено значение True в "settings.py".
Вот код:
settings.py:
APPEND_SLASH = True
ADMIN_URL = "admin/"
urls.py:
from django.conf import settings
from django.contrib import admin
from django.urls import include, path, re_path
from myapp.views import my_catch_all_view
urlpatterns = [
path(settings.ADMIN_URL, admin.site.urls),
re_path(r"^.*", my_catch_all_view),
]
Если я перейду на «localhost: 8000», я правильно перейду к моему всеобъемлющему представлению.
И если я перейду на «localhost: 8000 / foobar /», я правильно попаду в мое всеобъемлющее представление.
И если я перейду на «localhost: 8000 / admin /», я правильно попаду в представление администратора.
Но, если я перейду к "localhost: 8000 / admin", я неправильно попаду в мое всеобъемлющее представление.
Я видел этот ответ, но, к сожалению, у меня это не работает.
Какие-либо предложения?
@Tushortz - Спасибо. Это не имеет никакого эффекта.
Как насчет re_path(r"^./*", my_catch_all_view),, мы ловим его только на slash в конце. Если у него нет /, он будет перенаправлен туда?
Есть несколько других подходов, которые вы могли бы рассмотреть - установите handler404 для вашего всеобъемлющего представления (обратите внимание, что это может не подходить, если вам нужна другая страница 404 для представлений, которые повышают Http404). Или вы могли бы создать подкласс CommonMiddleware и вызвать там свое всеобъемлющее представление.
@Alasdair - я не знаю, почему это не работает. Поведение, которое я вижу с этим ответом, заключается в том, что «admin /» переходит в представление администратора, а «admin» - в my_catch_all_view.
@Alasdair - решение handler404 звучит многообещающе. Если я не смогу придумать другой способ, я воспользуюсь им. Спасибо.
Если ваше универсальное регулярное выражение - r'^.*/$', как в этом ответе, то admin не должен переходить по URL-адресу catch all. admin не будет соответствовать общему списку, поэтому вы должны быть перенаправлены на admin/, который будет соответствовать шаблону URL-адреса администратора перед общедоступным.
@Alasdair - это больше не работает для "localhost: 8000" (без пути). Я могу обойти это, добавив path("", my_catch_all_view) в urlpatterns. Но это похоже на неприятный.
Правда, вам нужно будет обработать случай отсутствия пути, если вы использовали этот ответ. Но это немного отличается от того, чтобы сказать «это не работает для меня» в вашем исходном вопросе или что это заставляет «admin» перенаправлять на my_catch_all_view в вашем комментарии.






попробуйте
r'^(?P<url>.*)$')