>  기사  >  백엔드 개발  >  Python에서 django 양식 유효성 검사를 사용하는 방법

Python에서 django 양식 유효성 검사를 사용하는 방법

高洛峰
高洛峰원래의
2017-03-30 17:20:432064검색

1. django m검증용 소개

프런트 엔드 HTML 페이지의 백그라운드 처리 예제에 일부 데이터를 제출하기 위해 get, post, put 등을 사용해야 하는 경우가 있습니다.

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Form</title>
</head>
<body>
  <p>
    <form action="url" method="post" enctype="multipart/form-data">{% csrf_token %}
      <input type="text" name="username"/>
      <input type="password" name="password"/>
      <input type="submit" value="submit"/>
    </form>
  </p>
</body>

프런트 엔드 제출 및 백그라운드 획득:

from django.shortcuts import render,HttpResponse,redirect
from app01 import models
def Login(request):
  if request.method == "POST":
    username = request.POST.get("username")
    password = request.POST.get("password")
    return HttpResponse("Hello,%s"%(username))


이렇게 하면 기본 기능이 완성되어 기본적으로 사용할 준비가 된 것입니다.

단, 사용자 입력이 요구 사항을 따르지 않는 경우. (예를 들어 휴대폰 번호는 11자리를 입력해야 합니다.) 길이, 비밀번호의 복잡성 등) 입력한 데이터는 제출 후 다시 오면 손실됩니다

물론, 뷰에 입력된 데이터를 수동으로 가져와서 웹 페이지에 전달합니다. 이는 가능하지만 매우 불편하므로 Django는 검증과 같은 일련의 문제를 해결하기 위해 더 간단하고 사용하기 쉬운 양식을 제공합니다

. Django의 플러그인 라이브러리는 정말 강력합니다. 간단하고 확장하기 쉽습니다. 위 내용에서는 form이 사용되는 이유만 소개합니다.

2. 폼 검증 애플리케이션

django APP에서 새로운 모듈 폼을 생성해야 하며, 구체적인 내용은 다음과 같습니다

class RegisterForm(forms.Form):
  email = forms.EmailField(required=True,
               error_messages={&#39;required&#39;: "邮箱不能为空"})
  password = forms.CharField(max_length=120,
                min_length=6,
                required=True,
                error_messages={&#39;required&#39;: "密码不能为空"})
  invite_code = forms.CharField(required=True,error_messages={&#39;required&#39;: "验证码不能为空"})

프런트엔드 페이지

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>register</title>
</head>
<body>
  <p>
    <form action="url" method="post" enctype="multipart/form-data">
      <input type="text" name="username"/>
      <input type="password" name="password"/>
      <input type="text" name="code"/>
      <input type="submit" value="submit"/>
    </form>
  </p>
</body>

백엔드 뷰 처리

def register(request):
  if request.method == "POST":
    f = Reg_Form(request.POST)
    if f.is_valid():
      user = f.cleaned_data["username"]
      pwd = f.cleaned_data["password"]
      code = f.cleaned_data["code"]
      res_code = request.session.get("code", None)
      result = models.UserInfo.objects.filter(userexact=user,pwdexact=pwd)
      if code.upper() == res_code.upper() and result:
        models.UserInfo.objects.filter(userexact=user).update(status=1)
        request.session["user"] = user
        return redirect("/home")
      else:
        return render(request, "register.html", {"error": f.errors, "form": f})else:return render(request, "register.html")

Reg_Form(request.POST)은 양식 클래스를 사용하여 제출된 데이터를 처리하여 데이터 속성의 적법성을 검증하고, is_valid() 이후의 논리적 처리가 적법하며, 검증된 데이터는 인스턴스화 후 반환된 cleaned_data,

cleaned_data는 사전 데이터 형식이며 오류 정보는 오류에 저장됩니다. 예를 들어 뷰에서 모든 오류 메시지를 보려면 print(f.errors), 사용자의 오류 메시지만 보고 싶다면

 print(form.errors[&#39;username&#39;][0])

템플릿을 통해 렌더링할 수 있습니다. 예를 들어 프런트 엔드 페이지로 돌아갑니다

<form action="/form/" method="POST">
{% csrf_token %}
    <p class="input-group">
      {#接收后台传过来的form对象,自动生成input标签#}
      {{ form.user }}
      {#从后台传过来的error是字典,直接{{ error.user.0 }}呈现错误信息#}
       {#如果后台返回了错误信息,将错误信息放入span标签,在页面显示,否则不显示#}
      {% if error.username.0 %}
      <span>{{ error.userusername.0 }}</span>
      {% endif %}
    </p>
    <p class="input-group">
      {{ form.password }}
      {% if error.pwd.0 %}
      <span>{{ error.password .0 }}</span>
      {% endif %}
    </p>
    <p>
      <input type="submit" value="提交" />
    </p>
  </form>

3. 자체 생성 입력 상자

양식 클래스

class RegisterForm(forms.Form):
  style = &#39;form-control input-lg&#39;
  phone = forms.CharField(widget=forms.TextInput(attrs={&#39;class&#39;: style,
                              &#39;name&#39;: &#39;title&#39;})),
              required=True,
              error_messages={&#39;required&#39;: ugettext_lazy(&#39;*Required&#39;)})
  code = forms.CharField(widget=forms.NumberInput(attrs={&#39;placeholder&#39;: &#39;验证码&#39;,
                              &#39;class&#39;: style}),
              min_length=4,
              max_length=4,
              required=True,
              error_messages={&#39;required&#39;: ugettext_lazy(&#39;*Required&#39;)})
  password = forms.CharField(widget=forms.PasswordInput(attrs={&#39;placeholder&#39;: &#39;请输入密码&#39;,
                                 &#39;class&#39;: style}),
                min_length=6,
                required=True,
                error_messages={&#39;required&#39;: ugettext_lazy(&#39;*Required&#39;)})

보기

def register(request):
  if request.method == "POST":
    f = RegisterForm(request.POST)
    if f.is_valid():
      user = f.cleaned_data["username"]
      pwd = f.cleaned_data["password"]
      code = f.cleaned_data["code"]
      res_code = request.session.get("CheckCode", None)
      result = models.UserInfo.objects.filter(userexact=user,pwdexact=pwd)
      if code.upper() == res_code.upper() and result:
        models.UserInfo.objects.filter(userexact=user).update(status=1)
        request.session["user"] = user
        return redirect("/home")
      else:
        return render(request, "login.html", {"error": f.errors, "form": f})
    else:
      return render(request, "login.html", {"error": f.errors, "form": f})
  else:
    # 如果不是post提交数据,就不传参数创建对象,并将对象返回给前台,直接生成input标签,内容为空
    f = Log_Form()
    return render(request, "login.html", {"form": f})

프런트 엔드 페이지

<body>
  <form action="/form/" method="POST">
  {% csrf_token %}
    <p class="input-group">
{#      接收后台传过来的form对象,自动生成input标签#}
      {{ form.user }}
{#      从后台传过来的error是字典,直接{{ error.user.0 }}呈现错误信息#}
{#      如果后台返回了错误信息,将错误信息放入span标签,在页面显示,否则不显示#}
    <p class="input-group">
      {{ form.email }}
      {% if error.email.0 %}
      <span>{{ error.email.0 }}</span>
      {% endif %}
    </p>
     <p class="input-group">
      {{ form.password }}
      {% if error.password.0 %}
      <span>{{ error.password.0 }}</span>
      {% endif %}
    </p>
       <p class="input-group">
      {{ form.code }}
      {% if error.book_type.0 %}
      <span>{{ error.code.0 }}</span>
      {% endif %}
    </p>
    <p>
      <input type="submit" value="提交" />
    </p>
  </form>
</body>
</html>

4. 유효성 검사가 개선되었습니다

docs.djangoproject.com/en/dev/ref/forms/validation/

양식 유효성 검사의 실행 순서는 초기화, 정리, 유효성 검사, 저장입니다

clean 및 유효성 검사는 form.is_valid() 메서드에서 연속적으로 호출됩니다.

clean 및 기타 단계에서 발생한 예외: Exception 값: 'NoneType' 유형의 인수는 반복 가능하지 않습니다.

cleaned_data의 특정 필드 값이 목록이어야 할 수도 있지만 실제로는 null 값입니다.

clean 메소드를 재작성할 때 clean_data를 반환하는 것을 잊지 마세요

이런 종류의 재작성은 사용자가 제출한 데이터가 형식으로 탐지를 수행한 후 사용자에게 데이터를 반환하도록 할 수 있습니다. 클래스를 생성하고 데이터가 합법적인 후에 논리를 수행하면 추가 처리를 수행하고 사용자에게 반환할 필요가 없으므로 더 편리하고 합리적입니다.

보충:

4. 폼의 초기화 방법

① 인스턴스화 oneform(initial={ 'onefield':value})

②필드 정의 시 초기값 지정 oneformfield = form.CharField(initial=value)

③Form 클래스의 init() 메서드를 다시 작성합니다. self.fields ['onefield'].initial = value

④instanse 매개변수를 양식에 전달할 때(예: oneform(instanse=onemodel_instance)), 처음 세 가지 초기화 메서드는 모두 실패합니다. init를 다시 작성할 때에도 먼저 호출하세요. 부모 클래스의 init는 다시 메서드 ③을 사용하지만 여전히 작동하지 않습니다(별로 멋지지는 않습니다).

이번에 필드 값을 다시 초기화하려면 init()에서 self.initial['title'] = value만 사용하고, 초기 속성에 값을 직접 할당하면 됩니다 Form 클래스의 사전입니다.

from django import forms
class RegisterForm(forms.Form):
  email = forms.EmailField(required=True,
               error_messages={&#39;required&#39;: "邮箱不能为空"})
  password = forms.CharField(max_length=120,
                min_length=6,
                required=True,
                error_messages={&#39;required&#39;: "密码不能为空"})
  invite_code = forms.CharField(required=True,error_messages={&#39;required&#39;: "验证码不能为空"})
  def clean(self):
    # 用户名
    try:
      email = self.cleaned_data['email']
    except Exception as e:
      raise forms.ValidationError(u"注册账号需为邮箱格式")
    # 验证邮箱
    user = User.objects.filter(username=email)
    if user: # 邮箱已经被注册了
      raise forms.ValidationError(u"邮箱已被注册")
    # 密码
    try:
      password = self.cleaned_data['password']
    except Exception as e:
      print('except: ' + str(e))
      raise forms.ValidationError(u"请输入至少6位密码")
    return self.cleaned_data

위는 편집자가 소개한 Python에서의 django 양식 확인 방법입니다. 궁금한 사항이 있으면 메시지를 남겨주시면 편집자가 답변해 드리겠습니다. 시간에 당신에게. 또한 PHP 중국어 웹사이트를 지원해 주신 모든 분들께 감사드립니다!

Python에서 django 양식 유효성 검사를 사용하는 방법에 대한 더 많은 관련 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.