English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Обработка форм Django

Создание формы в Django подобно созданию модели. Здесь нам нужно наследовать поля класса от Django и добавить их в форму. Давайте добавим файл forms.py в папку myapp, который содержит форму нашего приложения. Мы создадим форму для входа в систему.

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.