지식 확장 -Django 양식 : 장고 전투 1 권한 관리는 -06 기능

이 프로젝트에서 우리는 예의 수 (삭제 중 후 코드가 아닌 프로젝트 코드, 테스트의이 섹션)을 통해 더 I 장고 양식 내용은이 섹션을 사용, 장고 양식 및 ModelForm 검증 기능을 사용하고있다.

1 양식을 사용하여

하나는 HTML 양식 기능을 사용할 수 있으며, 사용자가 HTML 양식으로 배경에 정보를 제출하는 사용자의 로그인 인증을 완료 : 실제 전투에서 1- [사용자 인증 장고 권한 관리는 -03 특징].
우리는 sandboxMP / 템플릿 / 시스템 / 사용자 / 볼 login.html 내용 :

{% extends "system/users/user-base.html" %} {% block user-content %} <!-- /.login-logo --> <div class="login-box-body form-"> <p class="login-box-msg"></p> <p></p> <form action="" method="post"> <div class="form-group has-feedback {% if login_form.errors.username %}has-error{% endif %}"> <input name="username" class="form-control" placeholder="用户名或手机号" value="{{ login_form.username.value }}"> <!--type="email"前端控制email输入验证--> <span class="glyphicon glyphicon-envelope form-control-feedback"></span> </div> <div class="form-group has-feedback {% if login_form.errors.password %}has-error{% endif %}"> <input name="password" type="password" class="form-control" placeholder="密码" value="{{ login_form.password.value }}"> <span class="glyphicon glyphicon-lock form-control-feedback"></span> </div> <div class="row"> <div class="col-xs-8"> </div> <!-- /.col --> <div class="col-xs-4"> <button type="submit" class="btn btn-primary btn-block btn-flat">登录</button> </div> <!-- /.col --> </div> {% csrf_token %} </form> {% if msg %} <!--判断如果后端返回用户验证错误信息,前端页面输出错误信息--> <p class="text-red">{{ msg }}</p> {% endif %} </div> <!-- /.login-box-body --> </div> <!-- /.login-box --> {% endblock %}

랜딩 페이지 라벨 지침 :

1、<form action="" method="post"> :定义了form的HTTP方法为POST, 和请求地址为当前页 2、<input name="username"> input类型,用户接收用户输入内容,其中name属性定义了input元素的名称,用于对提交到服务器后的表单数据进行识别。 3、<button type="submit">登录</button>:提交按钮 4、{% csrf_token %}:当提交一个启用CSRF防护的POST表单时,必须使用上面的csrf_token 模板标签 

1.1 장고의 양식을 만듭니다

형성하기 위해 전면을 사용하여 템플릿의 HTML 양식에 의해 만들어진, 우리는 또한 Djang가 자동으로 양식을 생성하기 위해 제공 및 HTML로 렌더링 된 폼 클래스를 사용할 수 있습니다.
1, 수정 sandboxMP / 응용 프로그램 / 시스템 / forms.py은 다음이 추가되었습니다

from django import forms

class UserTestForm(forms.Form):
    username = forms.CharField(label='用户名', max_length=10) password = forms.CharField(label='密码'max_length=10) 

Form 클래스의 두 개의 필드가 상기 정의 MAX_LENGTH 최대 길이 입력 필드를 정의한다.
is_valid 양식 () 메소드를 갖는 예는 입력 필드가 검증 할 수 있고, 모든 필드가 입력되는 경우이 방법이 유효 호출되면 폼 cleaned_data 속성에 데이터를 true를 반환하고 저장한다.

1.2 처리보기

폼 데이터에 의해 정의 된 뷰는 다음과 같은 기능을 달성 인스턴스화 :
액세스는 GET 요청의 도면의 경우, 1, 비어있는 형태를 생성하고 템플릿을 렌더링
수신하는 POST 요구 양식을 제출하는 경우, (2) is_valid 사용 형태 데이터 () 메소드는 검증 된
데이터 검증이 정상적으로 합법적 비즈니스 로직, 데이터 서브 규칙은 에러 메시지를 리턴 행하고, (3)
다음과 같은 내용을 첨가 sandboxMP / 애플리케이션 / 시스템 / tests.py을 수정하려면

from django.shortcuts import render, HttpResponseRedirect
from django.views.generic.base import View
from .forms import UserTestForm class FormTestView(View): def get(self, request): test_form = UserTestForm() return render(request, 'system/users/form_test.html', {'test_form': test_form}) def post(self, request): test_form = UserTestForm(request.POST) ret = dict(test_form=test_form) if test_form.is_valid(): # form验证通过后,重定向到项目首页,由于项目IndexView限制登陆访问了,如果系统没有登陆,这个重定向会先跳到登陆页面。 return HttpResponseRedirect('/') return render(request, 'system/users/form_test.html', ret) 

참고 :보기 만 한 입력 데이터가없는 사용자의 로그인 인증에 페이지에 유효 점프, 한, Form 클래스 렌더링 및 유효성을 입증.

1.3 URL 구성

Form 클래스 액세스 URL의 측정보기를 추가, sandboxMP / sandboxMP / urls.py를 수정 :

from system.tests import FormTestView

urlpatterns = [
    '''原有内容省略'''
    path('form_test/', FormTestView.as_view()), ] 

1.4 구성 템플릿

새로운 템플릿을 다음과 같이 sandboxMP / 템플릿 / 사용자 / form_test.html는 읽

<form action="" method="post" novalidate> {% csrf_token %} {{ test_form }} <input type="submit" value="Submit" /> </form> 

프로젝트 액세스 http://127.0.0.1:8000/form_test을 실행, 클래스 속성과 필드를 기반으로 장고 모델을보고, HTML 태그 속성에서 자동으로 해당 폼 태그를 생성 할 수 있습니다. 생성 태그가 위치한 {{} test_form}에 배치됩니다.

1.5 양식 필드

forms.CharField 필드 외에 위의 증명에서, 장고 양식은 양식 필드를 많이 구축, 양식 필드 내장 쿼리 https://docs.djangoproject.com/en/2.1/ref/forms/fields/

1.6 데이터를 취득

양식에 의해 제출 된 데이터를 한 번 () 성공적으로 인증 is_valid 호출하여 다음 양식의 데이터는 form.cleaned_data 사전에 저장됩니다. 물론, 우리는 여전히 reques.POST 확인되지 않은에서 직접 데이터를 얻을 수 있습니다.
1 변형 sandboxMP / 애플리케이션 / 시스템 / tests.py 각각 데이터를 취득하고 form.cleaned_data request.POST 의한 입력을 형성하기 위해 :

class FormTestView(View):

    def get(self, request): test_form = UserTestForm() return render(request, 'system/users/form_test.html', {'test_form': test_form}) def post(self, request): test_form = UserTestForm(request.POST) ret = dict(test_form=test_form) ret['errors'] = test_form.errors.as_json() if test_form.is_valid(): # 通过form.cleaned_data获取通过表单验证的数据 username = test_form.cleaned_data['username'] password = test_form.cleaned_data['password'] # 依然可以通过request.POST来获取数据 username1= request.POST['username'] return HttpResponseRedirect('/') return render(request, 'system/users/form_test.html', ret) 

2, 디버그 동작은 다음 도면 디버깅을 참조하여 동작 :

- 在pycharm中开启debug模式
- 在form.is_valid()验证位置打上断点 - 打开浏览器访问http://127.0.0.1:8000/form_test - 在网页中输入用户名,密码,点击【Submit】提交表单数据 - 在pycharm中按F6进行程序调试,可以看到通过is_valid()验证后,可以通过clean_data来获取表单数据,同样也可以通过request.POST来获取表单数据 - 最后记得去掉debug断点 

효율적으로 절차 적 문제를 찾아 분석 할 수있는 디버그 조정을 잘 활용합니다.

기타 1.7

양식은이 부분을 너무 많이 도입은 공식 문서를 참조 할 수 있습니다 관심이 매뉴얼 렌더링 및 오류 메시지를 렌더링이 프로젝트 렌더링 기능의 형태로 사용되지 않습니다 지원합니다.

이 모델 양식의 ModelForm

2.1 ModelForm

在【Django实战1-权限管理功能实现-05:组织架构的添加】一节中我们已经使用到了ModelForm, 通过ModelForm可以创建与Djang模型紧密映射的表单。ModelForm的优势在于,我们已经在ORM中定义好了model模型,不用再写一个forms.Form类来一个一个定义表单中的字段。
。 例如:sandboxMP/apps/system/forms.py中的StructureForm:

from django import forms
from .models import Structure


class StructureForm(forms.ModelForm): class Meta: model = Structure fields = ['type', 'name', 'parent'] 

上面的例子中
1、创建一个类:StructureForm,它继承了forms.ModelForm;
2、在StructureForm中设置了元类Meta,设置了model属性关联到ORM模型中的Structure;
3、在Meta中设置了fields属性,定义在表单中使用的字段列表,列表里面的值是ORM模型Structure中的字段名。

2.2 ModelForm的字段选择

2.1中我们通过ModelForm的fields属性,通过列表的形式,添加了要使用的字段。然而有的时候要使用的字段过多,可以将fields属性设置为__all__,将映射的模型中的全部字段都添加到表单中。

from django import forms
from .models import Structure


class StructureForm(forms.ModelForm): class Meta: model = Structure fields = '__all__' 

当然也可以使用exclude属性排除某些字段,然后将剩下的字段作为表单字段。

from django import forms
from .models import Structure


class StructureForm(forms.ModelForm): class Meta: model = Structure exclude = ['parent', ] 

2.3 ModelForm的验证

与普通的表单验证类似,模型表单也可以调用is_valid()方法。

2.4 save()方法的使用

ModelForm有一个save()方法,这个方法根据表单绑定的数据创建并保存数据库对象。ModelForm的子类可以接受现有的模型实例作为关键字参数instance;如果提供实例,则save()将更新该实例。 如果没有提供,save() 将创建模型的一个新实例。
在【Django实战1-权限管理功能实现-05:组织架构的添加】一节中,我们已经使用过ModelForm的save()方法。

# sandboxMP/apps/system/views_structure.py中 save()方法的使用
class StructureCreateView(LoginRequiredMixin, View): def get(self, request): ret = dict(structure_all=Structure.objects.all()) return render(request, 'system/structure/structure_create.html', ret) def post(self, request): res = dict(result=False) structure = Structure() structure_form = StructureForm(request.POST, instance=structure) if structure_form.is_valid(): # 表单提交的组织架构信息数据通过structure_form验证后,调用save()方法保存到数据库对象中。 structure_form.save() res['result'] = True return HttpResponse(json.dumps(res), content_type='application/json') 

추천

출처www.cnblogs.com/jameslove/p/10988324.html