Доступ к запрошенному URL в перенаправлении Django handler404? - PullRequest
0 голосов
/ 03 апреля 2019

Я уверен, что ответ на этот вопрос тривиален, но я потратил пару часов с Google и переполнением стека, не найдя ответа.

Я создаю Django CMS для многоязычного веб-сайта. URL-адреса принимают форму:

https://example.com/xx/subject

где x - двухбуквенный код языка (en = английский, fr = французский). Например:

https://example.com/en/about-us
https://example.com/fr/a-propos

Мне нужно иметь доступ к запрошенному URL-адресу из представления handler404, чтобы предоставить посетителям соответствующий контент.

В настоящее время у меня есть рабочий редирект 404 в приложении Django:

project.urls.py

handler404 = 'myapp.views.error404'

myapp.views.py

def PageView(request, lang, subject):
    [creates a page with DB content based on lang & subject]

def error404(request, *args, **kwargs):
    return PageView(request,'en','404page',)

Я хотел бы знать, какой запрашиваемый URL был , чтобы перенаправить посетителя на страницу на его языке.

В этой системе страница 404 будет страницей в CMS, как и любая другая, поэтому она будет редактируемой пользователем CMS (я не использую шаблоны Django для создания страниц).

В БД будет одна запись «404 страницы» для каждого языка.

Вот нерабочий пример того, что я ищу:

def error404(request, *args, **kwargs):
    lang = args[0]
    subject = args[1]
    if lang = 'fr':
        return PageView(request,'fr','error404',)
    else:
        return PageView(request,'en','error404',)

Если кто-то запросит example.com / fr / quelque-selected , я хочу показать им содержимое из fr / 404Page .

Если кто-то запросит example.com / mlkqdjsf или example.com / ru / not-a-page , я хочу показать им содержимое ru / 404page .

В обоих случаях я буду использовать PageView , который я использую для создания обычных страниц сайта.

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019

Если вас интересует только язык, вы можете использовать функцию get_language_from_request:

from django.utils import translation

def error404(request, *args, **kwargs):
    language = translation.get_language_from_request(request, check_path=True)
    return PageView(request, language, 'error404')

Аргумент check_path должен сначала проверить, начинается ли URL с кода языка, который, я думаю,это то, что вы хотите.

Проверьте документацию django о get_language_from_request и других функциях, связанных с переводом.

0 голосов
/ 03 апреля 2019

Я думаю, что вы можете сделать это с request.path:

def error404(request, *args, **kwargs):
    lang = request.path.split('/')[1]
    if lang = 'fr':
        return PageView(request,'fr','error404',)
    else:
        return PageView(request,'en','error404',)
...