Являются ли 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
В соответствии с документацией
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
особенный, но только если вы подчинитесь некоторым взглядам.