Django с использованием include () в качестве аргумента path () - PullRequest
2 голосов
/ 21 апреля 2020

Я учусь Django.

В учебнике написано:

Функция path () передал четыре аргумента, два обязательных: route и view , и два необязательных: kwargs и name. На этом этапе стоит посмотреть, для чего эти аргументы.

аргумент path (): view

Когда Django находит соответствующий шаблон, он вызывает указанный просмотр функции с объектом HttpRequest в качестве первого аргумента и любых «захваченных» значений из маршрута в качестве аргументов ключевого слова. Ниже мы приведем пример этого.

На мой взгляд, view - это функция, которая принимает HttpRequest в качестве аргумента и возвращает HttpResponse.

, но в mysite/urls.py path() используется следующим образом path("polls/", include("polls.urls")), а метод inclue возвращает кортеж (urlconf_module, app_name, namespace), а не функцию.

Почему можно использовать include() здесь?

Буду признателен, если кто-нибудь сможет помочь.

1 Ответ

2 голосов
/ 21 апреля 2020

Документация говорит, что

Аргумент представления является функцией представления или результатом as_view () для представлений на основе классов. Это также может быть django .urls.include ().

И если вы посмотрите на исходный код,

def _path(route, view, kwargs=None, name=None, Pattern=None):
    if isinstance(view, (list, tuple)):
        # For include(...) processing.
        pattern = Pattern(route, is_endpoint=False)
        urlconf_module, app_name, namespace = view
        return URLResolver(
            pattern,
            urlconf_module,
            kwargs,
            app_name=app_name,
            namespace=namespace,
        )
    elif callable(view):
        pattern = Pattern(route, name=name, is_endpoint=True)
        return URLPattern(pattern, view, kwargs, name)
    else:
        raise TypeError('view must be a callable or a list/tuple in the case of include().')

вы увидите, что он просто проверяет аргументы вводят и делают разные вещи в зависимости от того, является ли он кортежем или вызываемым.

...