Djangoの戦闘の1-著作権管理機能-06:知識の拡張-Djangoフォーム

このプロジェクトでは、多数の例(コード非プロジェクトコードのこのセクションでは、削除のいずれかの後にテスト)を介して、より多くのI Djangoのフォームを学ぶために、このセクションを使用し、DjangoのフォームとのModelForm検証機能を使用してきました。

1フォームを使用して

実際の戦闘1- [Djangoの著作権管理機能-03:ユーザー認証]で1は、HTMLのフォーム機能を使用する必要があり、ユーザーは、HTML形式で背景に情報を送信するユーザのログイン認証を完了します。
私たちは、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にレンダリングするために提供Formクラスを使用することができます。
図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) 

フォームクラスの2つのフィールドによって上記で定義された、MAX_LENGTHが最大長入力フィールドを定義します。
すべてのフィールドが入力された場合IS_VALIDフォーム()メソッドを有する例は、入力フィールドを検証することができ、この方法が有効な呼び出されたとき、それは真を返し、フォームcleaned_dataプロパティにデータを格納します。

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、クラスの属性やフィールドに基づいてDjangoのモデルを見て、自動的にHTMLタグの属性に対応するフォームタグを生成します。生成タグが位置{{}} test_formに配置されています。

1.5フォームフィールド

forms.CharFieldフィールドに加えて上記実証し、Djangoのフォームは、フォームフィールドの多くを建て、フォームフィールドは、クエリを構築しました: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

フォームも、この部分ではない、あまりにも多くの導入は、公式ドキュメントを参照することができます興味を持っている、手動レンダリングとエラーメッセージをレンダリングするには、プロジェクトがレンダリング能力の形で使用されることはありませんサポートしています。

2、モデルフォームの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