English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
myapp/forms.py
# Filename : example.py # Copyright : 2020 By w3codebox # Author by: ru.oldtoolbag.com # Date: 2020-08-08 # -*- coding: utf-8 -*- from django import forms class LoginForm(forms.Form): user = forms.CharField(max_length = 100) password = forms.CharField(widget = forms.PasswordInput())
Как видно выше, тип поля можно использовать параметр 'widget' для рендеринга в HTML; в нашем примере, мы хотим скрыть пароль, чтобы он не отображался. В нашем примере, мы хотим скрыть пароль, не отображая его. Ввод даты - это DateInput, CheckBoxInput - это флажок и т.д.
Использование форм в视图
Есть два типа HTTP-запросов, они分别是 GET и POST. В Django, как параметр передается в объект запроса виджета, есть свойство «метод», где тип запроса устанавливается, и все данные, переданные через POST, могут быть получены через словарь request.POST.
Давайте создадим виджет входа в myapp/views.py −
# Filename : example.py # Copyright : 2020 By w3codebox # Author by: ru.oldtoolbag.com # Date: 2020-08-08 # -*- coding: utf-8 -*- from myapp.forms import LoginForm def login(request): username = "not logged in" if request.method == "POST": #Get the posted form MyLoginForm = LoginForm(request.POST) if MyLoginForm.is_valid(): username = MyLoginForm.cleaned_data['username'] else: MyLoginForm = Loginform() return render(request, 'loggedin.html', {"username" : username})
Эта视图将通过 loggedin.html отображать результаты формы входа. Чтобы протестировать её, нам сначала нужно получить шаблон формы входа. Давайте назовём его: login.html.
# Filename : example.py # Copyright : 2020 By w3codebox # Author by: ru.oldtoolbag.com # Date: 2020-08-08 <html> <body> <form name = "form" action = "{% url "myapp.views.login" %}" method = "POST" >{% csrf_token %} <div style = "max-width:470px;"> <center> <input type = "text" style = "margin-left:20%;" placeholder = "Identifiant" name = "username" /> </center> </div> <br> <div style = "max-width:470px;"> <center> <input type = "password" style = "margin-left:20%;" placeholder = "password" name = "password" /> </center> </div> <br> <div style = "max-width:470px;"> <center> <button style = "border:0px; background-color:#4285F4; margin-top:8%; height:35px; width:80%;margin-left:19%;" type = "submit" value = "Login" > <strong>Login</strong> </button> </center> </div> </form> </body> </html>
Шаблон будет отображать форму для входа и发布 результаты, которые мы видели на странице входа. Вы, возможно, уже заметили, что это просто тег для предотвращения атак CSRF (Cross-Site Request Forgery) на вашем сайте.
# Filename : example.py # Copyright : 2020 By w3codebox # Author by: ru.oldtoolbag.com # Date: 2020-08-08 {% csrf_token %}
После того как у нас есть шаблон для входа, нам нужно представить шаблон loggedin.html после обработки формы.
# Filename : example.py # Copyright : 2020 By w3codebox # Author by: ru.oldtoolbag.com # Date: 2020-08-08 <html> <body> Вы are : <strong>{{username}}</strong> </body> </html>
Теперь нам нужно только URL-адреса, чтобы начать: myapp/urls.py
# Filename : example.py # Copyright : 2020 By w3codebox # Author by: ru.oldtoolbag.com # Date: 2020-08-08 from django.conf.urls import patterns, url from django.views.generic import TemplateView urlpatterns = patterns('myapp.views', url(r'^connection/',TemplateView.as_view(template_name = 'login.html')), url(r'^login/', 'login', name = 'login'))
Когда вы заходите на "/myapp/connection", мы получаем шаблон login.html, который отображается следующим образом −
После отправки таблицы, формат корректен. В нашем примере обязательно должны быть заполнены два поля, и вы получите следующий результат −
Если ваше имя пользователя polo и если вы забыли пароль, вы получите следующее сообщение −
с нашей собственной проверкой форм
В предыдущем примере проверка формы выполняется −
# Filename : example.py # Copyright : 2020 By w3codebox # Author by: ru.oldtoolbag.com # Date: 2020-08-08 MyLoginForm.is_valid()
Мы используем только встроенный механизм проверки форм Django, чтобы убедиться, что это поле обязательно в экземпляре. Давайте попробуем убедиться, что пользователь, который пытается войти, существует в нашей базе данных в качестве элемента Dreamreal. Для этого измените myapp/forms.py на −
# Filename : example.py # Copyright : 2020 By w3codebox # Author by: ru.oldtoolbag.com # Date: 2020-08-08 # -*- coding: utf-8 -*- from django import forms from myapp.models import Dreamreal class LoginForm(forms.Form): user = forms.CharField(max_length = 100) password = forms.CharField(widget = forms.PasswordInput()) def clean_message(self): username = self.cleaned_data.get("username") dbuser = Dreamreal.objects.filter(name = username) if not dbuser: raise forms.ValidationError("User does not exist in our db!") return username
Теперь, после вызова метода “is_valid”, мы получим правильный вывод, только если пользователь находится в нашей базе данных. Если нужно проверить поля формы, достаточно добавить метод, начинающийся с “clean_”, имя поля соответствует полю класса формы. Важно вызвать ошибку forms.ValidationError.