Являются ли name="submit" и name="next" предопределенными атрибутами в Django?

Я читаю книгу "Python Crash Course 2nd edition" и в настоящее время занимаюсь проектом Django.

В форме есть кнопка с именем="submit" и скрытый элемент ввода с именем="next".

В книге говорится, что кнопка с name="submit" - это кнопка отправки, а скрытый элемент формы с именем "next" - это аргумент value, который указывает Django, куда перенаправить пользователя после успешного входа в систему.

Я пытался найти кнопку с name="submit" и скрытый элемент input с name="next" в Django, но не смог найти никакой информации.

Как это работает? Они где-то предопределены или нет?

<form method="post" action="{% url 'users:login' %}">
     {% csrf_token %}
     {{ form.as_p }}
    
     <button name="submit">Log in</button>
     <input type="hidden" name="next" value="{% url 'learning_logs:index' %}" />

</form>

name="submit" и name="next" не являются предопределенными атрибутами. Вы можете использовать любое значение, например name="abracadabra", но при этом вам придется изменить и в коде request.POST.get("abracadabra").

Разные имена могут создать проблемы для понимания кода другими программистами.
Но разные имена могут быть своего рода защитой от веб-скреперов.

Проблема может возникнуть, когда вы используете сложный код (созданный кем-то другим) и трудно найти request.POST.get("next") в коде - поэтому просто сохранить это имя.
И в этой ситуации можно сказать, что name="submit" и name="next" "предопределены" автором этого сложного кода и мы должны использовать эти имена.

Предопределенными атрибутами для <input> являются type=hidden, type=text (и некоторые другие) и для <button> type=submit type=clear type=button, но они предопределены в HTML, а не в Django. Это информация для браузера, как отображать ввод и что делать, когда пользователь нажимает кнопку. Это не зависит от Django, PHP, Ruby или любого другого языка или фреймворка.

Сначала нужно выучить HTML

HTML: кнопка, ввод

В соответствии с документацией

The login_required decorator

login_required(redirect_field_name='next', login_url=None)
As a shortcut, you can use the convenient login_required() decorator

Здесь next - это имя поля перенаправления по умолчанию при использовании декоратора.

django.contrib.auth также использует поле next, так что если вы используете его для аутентификации, это тоже применимо.

The name="submit" does not make much sense, that should be type="submit". This has nothing to do with Django, a HTML <button> [mdn-doc] with a type=".." attribute [mdn-doc] will submit the HTML form it has been part of.

Что касается next, то это действительно работает для таких представлений, как LoginView и LogoutView, которые наследуют от . Эти переопределяют метод get_success_url() на [GitHub]:

def get_success_url(self):
    return self.get_redirect_url() or self.get_default_redirect_url()

def get_redirect_url(self):
    """Return the user-originating redirect URL if it's safe."""
    redirect_to = self.request.POST.get(
        self.redirect_field_name, self.request.GET.get(self.redirect_field_name)
    )
    url_is_safe = url_has_allowed_host_and_scheme(
        url=redirect_to,
        allowed_hosts=self.get_success_url_allowed_hosts(),
        require_https=self.request.is_secure(),
    )
    return redirect_to if url_is_safe else ""

It will thus look for the self.redirect_field_name (by default 'next') in the POST parameters, the GET parameters, or fallback on one specified in the view, or eventually the ones specified by the LOGIN_REDIRECT_URL [Django-doc] and LOGOUT_REDIRECT_URL [Django-doc] settings respectively.

Так что next особенный, но только если вы подчинитесь некоторым взглядам.

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