A、モデルの一般的な操作
1、13 APIのクエリ:すべて、フィルター、取得、値、values_list、明確な、ORDER_BY、逆、除外する(除外)、カウント、最初、最後、esits(があるかどうかを判断します)
違いは、すべての、値、values_listを知っている必要があります
すべて:クエリセットは、プリントのコレクション、置くオブジェクトのリストです
値:辞書フォーム
values_list:それはタプルの形態であり、
パフォーマンスは、すべての最低であります
2、唯一の和延期
。データリスト= models.Userinfo.objects.all()のみ( 「名前」、「メール」)# またはクエリセットのコレクションを取得するには、単に名前や電子メールを取る のDataListアイテムのために: 印刷(item.id) 印刷(項目.nameの) 印刷(item.pwd)#長いテーブルは、それがZaifayiciがする追加要求の値を取ると、フィールドを持つ データリスト= models.Userinfo.objects.all()。(延期 「name」を、「電子メールを「)#停止、名前や電子メールを取ることはありません DataListコントロールのアイテムのために: 印刷(item.id)を 印刷する(item.pwd)
あなたはあまりにも非効率的な取るためにのみフィールドの内部や他のフィールドを選択する場合にのみ使用して、データベース接続のできるだけ注意:
図3に示すように、ルーティングシステム
URLを生成するリバース:
2つの方法があります:{%のURL "A1" %}
( "A1")リバース
django.core.urlresolversインポート逆からインポートする逆必要と
/インデックス/ FUNC名= A1 {%のURL "A1"} リバース(A1 '') /インデックス/(\ D +)/ FUNC名= a2の {%のURL "A2"、11%} リバース( 'A2'、引数(= 11)) ?/インデックス/(P <NID>のD + \)/ FUNC名= a3を {%のURL "A2" NID = 11%} の逆( 'A3'、kwargsから= { 'NID':11})
4、Djangoのライフサイクル
Webサーバーゲートウェイ・インタフェース(PythonのWebサーバーのゲートウェイインターフェイス、WSGIと略します)
1、まずはwsgirefとuwsgi含むプロトコルであるWSGIモジュールを、行きます。
2、次にルーティング割当て-------ビュービュー
3、-----------レンダリングHTMLにデータベースからデータを取得
あなたは、JSファイルがレンダリングされていないインポートする場合は注意してください。
5、HTTPプロトコル
次のブログ記事を参照してください。
二、フォームのコンポーネント
、フォームコンポーネント入門
Formコンポーネントは、いくつかのことを行うことができます。
図1に示すように、ユーザ認証データ要求
図2に示すように、自動的に生成されたエラーメッセージ
3、利用者から提出された正しい情報を梱包
4.間違いがある場合は、前のエントリを保持するために、他のそれを訂正
4、入力タグが自動的に作成されたスタイルを設定することができます
フォーム部品の第二に、使用
1、ルールを作成
Fooクラス(フォーム):継承しなければなりません。# ユーザ名= xxxの パスワードは= XXXの メール= XXXの ここでの注意フィールドは名前フィールドの入力と一致していなければなりません
マッチ2、データおよびルール
まず輸入view.py
django.formsからフォームをインポート django.formsからフィールドをインポート django.formsインポートウィジェットからの
リダイレクト、からdjango.shortcutsをレンダリングインポート app01インポートモデルから #ここに壁紙をあなたのビューを作成します。 `` django.forms``インポートフォームから `` django.forms``インポートフィールドから django.forms``インポートウィジェット``から #1、ルールの作成 クラスTeacherForm(フォーム):#は継承しなければなりませんフォーム #フィールドを作成し、本質的には、正規表現のある ユーザ名= fields.CharField( 必要= Trueの#必要なフィールド error_messages = {「必須」:「!usernameは空にすることはできません」}、#表示中国のエラー ウィジェット= widgets.TextInput(ATTRSの= { "プレースホルダ" : " ユーザ名"、 "クラス": "フォーム -control"})# 自動的に生成された入力ブロック ) 」}))#空にすることはできません (メール= fields.EmailField パスワード= fields.CharField(= Trueの必要、error_messages、= { '必要': }「パスワードを空にすることはできません」、 ウィジェット= widgets.TextInput(attrsに= { 'プレースホルダ': ' パスワード'、 'クラス': 'フォーム -control'}))#を空にすることはできません 、= Trueの必要 error_messages、= { "必須":「Eメールを空にすることはできません! ! ""無効":"無効なメールボックス"}、 ウィジェット= widgets.EmailInput(ATTRS = {"プレースホルダ":" Eメール""クラス":"フォーム -control「})# 自動的に生成された入力ボックス )ではない#空のメールボックス形式は、一貫性のあることを ルールを使用して、#2:データとルールがマッチした :DEFのteacherindex(リクエスト) teacher_obj models.UserInfo.objects.all =() #印刷(teacher_obj)は 、レンダリング(要求、「teacherindex.htmlを返します"{" teacher_obj ":teacher_obj}) 追加(要求)DEF: IF request.method ==" GET「: フォーム= TeacherForm()だけ入力ボックスを表示するようにしましょう# リターンレンダリング(リクエストを、「add.html」 、{「フォーム」:フォーム}) 他: フォーム= TeacherForm(= request.POSTのデータ) #印刷(フォーム) #<クエリセット[<のUserInfo:のUserInfoオブジェクト>、<のUserInfo:のUserInfoオブジェクト>、<のUserInfo。UserInfoを>]> [オブジェクトの form.is_valid IF():#は、検証を開始します #印刷( '正常に実行'、form.cleaned_data)#すべてのマッチが成功し、辞書 #{ 'ユーザ名': 'ASD '、 'パスワード': '自衛隊'、「メール':' [email protected] '' ut_idを':1} form.cleaned_data。[' ut_idを「] =#1分教師または指導をクリアする models.UserInfo.objects.all()**(登録フォーム。 .cleaned_data) リターンリダイレクト( "/ teacherindex /") 他: タイプの"?=====" #印刷(、form.errors、(form.errors))#は失敗結果を返す 「#印刷(form.errorsを[ユーザ名"] [0])#GETにするページのレンダリング、失敗結果を返す 、(レンダリング要求を返す" add.htmlを" {"フォーム「:フォーム})
html.py
{%ブロック右%} <H1>添加老师信息</ H1> <時間> <フォームメソッド= "ポスト" NOVALIDATE> {%csrf_token%} <P>姓名:{{form.username}} </ P> { {form.errors.username.0}} <P>密码:{{form.password}} </ P> {{form.errors.password.0}} <P>邮箱:{{form.email}} < / P> {{form.errors.email.0}} <P> <INPUT TYPE = "提出"値= "提交"> </ P> </フォーム> {%末端ブロック%}
アクセスは、の図であるならばGET
、要求、それは空白のフォームを作成し、テンプレートをレンダリングするコンテキストインスタンスにそれを置きます。これは、我々は最初の訪問URLの間に発生すると予想されるものです。
あなたが提出するフォームを使用している場合はPOST
、要求を、ビューは再びフォームのインスタンスを作成し、要求内のデータを移入しますform = NameForm(request.POST)
。これは、(それが今バインディング形式である)「フォームにバインドデータ」と呼ばれています。
私たちは、フォームの呼び出しis_valid()
方法を、そうでない場合True
、我々はテンプレートに戻すには、この形を取るでしょう。この場合、データはもはや空のフォーム(非結合)であり、それは充填前にHTML形式で送信され、その後、必要に応じて編集し、それを修正します。
場合is_valid()
でTrue
、我々はできるようになりcleaned_data
、すべての合法的なフォームデータの属性を見つけます。HTTPを送信すると、次のステップは、我々はデータベースを更新したり、他の処理を行うために、このデータを使用することができます起こっている前にそれを伝えるために、ブラウザにリダイレクトします。
注意:ちょうど入力ボックスフォーム= TeacherForm()#引数なしに、
フォーム= TeacherForm(データ= request.POST)#配置データ及びルール(使用時に追加)と
フォーム= TeacherForm(初期= {「ユーザ名」:obj.username、「パスワード」:obj.password、[メール]:obj.email})#表示入力、およびデフォルト値のデータベースと入力ボックスに記入(編集使用時)
ウィジェット
各フォームフィールドは、対応有するWidget
HTMLフォームに対応するクラス、Widget
たとえば、<input type="text">
。
ほとんどの場合、フィールドには、合理的なデフォルトのウィジェットを持っています。たとえば、デフォルトでは、CharField
持っているTextInput Widget
、それはHTMLで生成します<input type="text">
。
データフィールド
どんなにどのような形提出データ、時に呼び出すことにより、is_valid()
検証が成功(is_valid()
リターンTrue
に位置)、フォームデータを検証し、form.cleaned_data
辞書。あなたは、Pythonを入力するためにこれらのデータは、うまく変換されています。
注:この時点で、あなたはまだからできるrequest.POST
未検証のデータへの直接アクセスが、データアクセス認証より良いです。
例えば上記の接触形態において、is_marriedはブール値であろう。同様に、IntegerField
およびFloatField
フィールド値はパイソンに変換されるint
とfloat
。
第三に、データベースのテーブルの設計
その際、いくつかの設計テーブル注意:
1、NID = models.AutoField(PRIMARY_KEY = TRUE)#デフォルトのDjangoがIDを追加します指定しない場合
NID = models.BigAutoField(PRIMARY_KEY = TRUE)#int型が、これらのBigAutoFieldを使用するために、あなたを満たすことができません
図2に示すように、コメントは、典型的には、クラスのクラスに追加されます
中国のヒントの3、verbose_name =「タイトル」フィールド
4、ForeignKeyの(=「テーブル名」に、tofield =「フィールド」)#は、これら二つに書き込みますが、関連するテーブルの名前を書くことを確認することはできません
5、releated_name = "UUU" 逆引き参照。テーブルManyTwoMany()またはForeignKeyの()が複数存在する場合releated_nameを追加する必要があります
6、常にでもテーブルに適切なフィールドを変更します
小さなフィールドの変更ではなく、さらにテーブル、テーブルにあまり適して次のようになります。選択肢は使用します
これは、クラスとテーブルで教師に置くことができ、彼らは同じ性質を持っているので、プロパティがすべて同じであれば、テーブルの上に置くことができます(推奨)
オープンマインドことができ、教師テーブルはテーブルの教師は、クラスの先生のテーブルがテーブルです。これも、パフォーマンスのテーブルが消費している、でも操作テーブルになります。
たとえば、次の記事と記事タイプ
分析:記事が型を持つ、タイプは複数の記事に対応することができ(記事とポストの種類は非常に多くの関係は、関連するフィールドは、マルチパーティを入れています)
A:でも、テーブルデザイン:
クラスニュース(models.Model): タイトル= models.CharField(max_lengthを= 32) 要約= models.CharField(MAX_LENGTH = 255) news_type = models.ForeignKey(= "NewsType"への) クラスNewsType(models.Model): type_title = models.CharField(MAX_LENGTH = 32)
ニュース:
タイトル概要は上記のID news_type_id
1トン....技術を... 2
2 1トン....技術...
3 ... 2トン....テクノロジー
NewsType:
IDタイトル
写真1
2は、1024蹴ら
3ピース
#查看所有新闻
new_list = models.News.objects.all()
行のnew_list中:
プリント(row.title、row.summary、row.news_type.title)
II:表中の操作:選択
クラスNews2(models.Model): タイトル= models.CharField(MAX_LENGTH = 32) 要約= models.CharField(MAX_LENGTH = 255) news_type_chices =( (1 '图片')、 (4 '挨踢1024')、 (3 '段子') ) news_type = models.IntegerField(選択肢= news_type_chices)
#查看所有新闻
new_list = News.objects.all()
行のnew_list中:
プリント(row.title、row.summary、row.get_news_type_display())
例II:ユーザーとユーザーの種類
A:でも、テーブルデザイン
UserTypeクラス(models.Model): "" " ユーザ種別テーブル、頻繁に変更の数 " "" タイトル= models.CharField(MAX_LENGTH = 32) クラスのUserInfo(models.Model): "" " ユーザテーブル:インストラクターとクラス " "" ユーザ名= models.CharField(MAX_LENGTH = 32) パスワード= models.CharField(MAX_LENGTH = 64) メールで= models.CharField(MAX_LENGTH = 32) UT = models.ForeignKey(=に"のUserType")
2:いなくても、テーブルデザイン:選択肢
クラスのUserInfo(models.Model): #"" " #1用户表 # """ ユーザ名= models.CharField(max_lengthを= 32) パスワード= models.CharField(max_lengthを= 64) 、電子メール= models.CharField(max_lengthを= 32、verbose_name = "邮箱") user_type_choices =( (1 '班主任')、 (2 '讲师') ) user_type_id = models.IntegerField(選択肢=のuser_type_choices)
第四に、ログイン
デコレータを提供することができます
デフAUTH(FUNC): デフインナー(要求、* argsを、** kwargsから): is_login = request.session.get( "is_login"、なし) is_loginない場合: リターンリダイレクト( "/ログイン/") RET = FUNC( * argsを、** kwargsからは) RETを返す インナー戻ります
それは注意する必要があります。
1、アクションが現在のデフォルトに提出し、パスを記述していません
2は、ポストによって背景にデータを送信するために、データを取得するために慣れます
3、一般的にいくつかのブラウザが認識されない可能性があり、値を追加提出
4、キー一般的な設定ファイルは大文字であります
A、モデルの一般的な操作
1、13 APIのクエリ:すべて、フィルター、取得、値、values_list、明確な、ORDER_BY、逆、除外する(除外)、カウント、最初、最後、esits(があるかどうかを判断します)
違いは、すべての、値、values_listを知っている必要があります
すべて:クエリセットは、プリントのコレクション、置くオブジェクトのリストです
値:辞書フォーム
values_list:それはタプルの形態であり、
パフォーマンスは、すべての最低であります
2、唯一の和延期
。データリスト= models.Userinfo.objects.all()のみ( 「名前」、「メール」)# またはクエリセットのコレクションを取得するには、単に名前や電子メールを取る のDataListアイテムのために: 印刷(item.id) 印刷(項目.nameの) 印刷(item.pwd)#長いテーブルは、それがZaifayiciがする追加要求の値を取ると、フィールドを持つ データリスト= models.Userinfo.objects.all()。(延期 「name」を、「電子メールを「)#停止、名前や電子メールを取ることはありません DataListコントロールのアイテムのために: 印刷(item.id)を 印刷する(item.pwd)
あなたはあまりにも非効率的な取るためにのみフィールドの内部や他のフィールドを選択する場合にのみ使用して、データベース接続のできるだけ注意:
図3に示すように、ルーティングシステム
URLを生成するリバース:
2つの方法があります:{%のURL "A1" %}
( "A1")リバース
django.core.urlresolversインポート逆からインポートする逆必要と
/インデックス/ FUNC名= A1 {%のURL "A1"} リバース(A1 '') /インデックス/(\ D +)/ FUNC名= a2の {%のURL "A2"、11%} リバース( 'A2'、引数(= 11)) ?/インデックス/(P <NID>のD + \)/ FUNC名= a3を {%のURL "A2" NID = 11%} の逆( 'A3'、kwargsから= { 'NID':11})
4、Djangoのライフサイクル
Webサーバーゲートウェイ・インタフェース(PythonのWebサーバーのゲートウェイインターフェイス、WSGIと略します)
1、まずはwsgirefとuwsgi含むプロトコルであるWSGIモジュールを、行きます。
2、次にルーティング割当て-------ビュービュー
3、-----------レンダリングHTMLにデータベースからデータを取得
あなたは、JSファイルがレンダリングされていないインポートする場合は注意してください。
5、HTTPプロトコル
次のブログ記事を参照してください。
二、フォームのコンポーネント
、フォームコンポーネント入門
Formコンポーネントは、いくつかのことを行うことができます。
図1に示すように、ユーザ認証データ要求
図2に示すように、自動的に生成されたエラーメッセージ
3、利用者から提出された正しい情報を梱包
4、如果其中有一个错误了,其他的正确这,保留上次输入的内容
4、自动创建input标签并可以设置样式
二、Form组件的使用
1、创建规则
class Foo(Form): #必须继承 username = xxx password = xxx email = xxx 注意这里的字段必须和input的name字段一致
2、数据和规则进行匹配
先导入view.py
from django.forms import Form from django.forms import fields from django.forms import widgets
from django.shortcuts import render,redirect from app01 import models # Create your views here. from django.forms import Form from django.forms import fields from django.forms import widgets # 1、创建规则 class TeacherForm(Form): #必须继承Form # 创建字段,本质上是正则表达式 username = fields.CharField( required=True, #必填字段 error_messages={"required":"用户名不能为空!!"}, #显示中文错误提示 widget=widgets.TextInput(attrs={"placeholder":"用户名","class":"form-control"}) #自动生成input框 ) password = fields.CharField(required=True, error_messages={'required': '密码不能为空'}, widget=widgets.TextInput(attrs={'placeholder': '密码', 'class': 'form-control'})) # 不能为空 email = fields.EmailField( required=True, error_messages={"required":"邮箱不能为空!!","invalid":"无效的邮箱"}, widget=widgets.EmailInput(attrs={"placeholder": "邮箱", "class": "form-control"}) # 自动生成input框 ) #不能为空且邮箱格式要一致 # 2、使用规则:将数据和规则进行匹配 def teacherindex(request): teacher_obj = models.UserInfo.objects.all() # print(teacher_obj) return render(request,"teacherindex.html",{"teacher_obj":teacher_obj}) def add(request): if request.method=="GET": form = TeacherForm() #只是让显示一个input框 return render(request,"add.html",{"form":form }) else: form = TeacherForm(data=request.POST) # print(form) #<QuerySet [<UserInfo: UserInfo object>, <UserInfo: UserInfo object>, <UserInfo: UserInfo object>]> if form.is_valid():# 开始验证 # print('执行成功',form.cleaned_data) # 所有匹配成功,字典 # {'username': 'asd', 'password': 'sdf', 'email': '[email protected]','ut_id':1} form.cleaned_data['ut_id'] = 1 #要分的清是班主任还是讲师 models.UserInfo.objects.all().create(**form.cleaned_data) return redirect("/teacherindex/") else: # print("=====?",form.errors,type(form.errors))#返回失败的结果 # print(form.errors["username"][0]) #拿到返回失败的结果,渲染到页面 return render(request,"add.html",{"form":form})
html.py
{% block right %} <h1>添加老师信息</h1> <hr> <form method="post" novalidate> {% csrf_token %} <p>姓名:{{ form.username }}</p>{{ form.errors.username.0 }} <p>密码:{{ form.password }}</p>{{ form.errors.password.0 }} <p>邮箱:{{ form.email }}</p>{{ form.errors.email.0 }} <p><input type="submit" value="提交"></p> </form> {% endblock %}
如果访问视图的是一个GET
请求,它将创建一个空的表单实例并将它放置到要渲染的模板的上下文中。这是我们在第一个访问该URL 时预期发生的情况。
如果表单的提交使用POST
请求,那么视图将再次创建一个表单实例并使用请求中的数据填充它:form = NameForm(request.POST)
。这叫做”绑定数据至表单“(它现在是一个绑定的表单)。
我们调用表单的is_valid()
方法;如果它不为True
,我们将带着这个表单返回到模板。这时表单不再为空(未绑定),所以HTML 表单将用之前提交的数据填充,然后可以根据要求编辑并改正它。
如果is_valid()
为True
,我们将能够在cleaned_data
属性中找到所有合法的表单数据。在发送HTTP 重定向给浏览器告诉它下一步的去向之前,我们可以用这个数据来更新数据库或者做其它处理。
注意: form = TeacherForm() #没有参数,只是一个input框
form = TeacherForm(data=request.POST) # 数据和规则放置一起 (添加的时候用)
form = TeacherForm(initial={'username':obj.username,'password':obj.password,'email':obj.email}) # 显示input,并且将数据库中的默认值填写到input框中 (编辑的时候用)
Widgets
每个表单字段都有一个对应的Widget
类,它对应一个HTML 表单Widget
,例如<input type="text">
。
在大部分情况下,字段都具有一个合理的默认Widget。例如,默认情况下,CharField
具有一个TextInput Widget
,它在HTML 中生成一个<input type="text">
。
字段的数据
不管表单提交的是什么数据,一旦通过调用is_valid()
成功验证(is_valid()
返回True
),验证后的表单数据将位于form.cleaned_data
字典中。这些数据已经为你转换好为Python 的类型。
注:此时,你依然可以从request.POST
中直接访问到未验证的数据,但是访问验证后的数据更好一些。
在上面的联系表单示例中,is_married将是一个布尔值。类似地,IntegerField
和FloatField
字段分别将值转换为Python 的int
和float
。
三、数据库表设计
设计表时注意的几点:
1、 nid = models.AutoField(primary_key=True) #如果不指定django会默认加上id的
nid = models.BigAutoField(primary_key=True) #但那些整型满足不了你的时候,就用BigAutoField
2、对于类的注释一般加在类里面
3、verbose_name=“标题” 字段的中文提示
4、ForeignKey(to = "表名",tofield= "字段") #这两个to可以不用写,但是关联的表名一定要写
5、releated_name = "uuu" 反向查询。如果一个表中有多个ManyTwoMany()或者ForeignKey()必须加上releated_name
6、字段经常变动的适合连表
字段变化小,不怎么变的适合在一个表中,不进行连表:就用choices
吧班主任和老师可以放到一个表中、因为他们有相同的属性,如果属性全是一样的,可以放在一个表里(推荐)
也可以分开放,老师表是老师表,班主任表是班主任表。这样就会进行连表操作,连表有性能消耗。
举例:文章和文章类型
分析:一个文章有一个类型,一个类型可以对应多个文章(所以文章和文章类型是一对多的关系,关联字段要放在多的一方)
一:连表设计:
class News(models.Model): title = models.CharField(max_length=32) summary = models.CharField(max_length=255) news_type = models.ForeignKey(to="NewsType") class NewsType(models.Model): type_title = models.CharField(max_length=32)
News:
id title summary news_type_id
1 t.... 科技... 2
2 t.... 科技... 1
3 t.... 科技... 2
NewsType:
id title
1 图片
2 挨踢1024
3 段子
# 查看所有新闻
new_list = models.News.objects.all()
for row in new_list:
print(row.title,row.summary,row.news_type.title)
二 :放在一个表中的操作:choices
class News2(models.Model): title = models.CharField(max_length=32) summary = models.CharField(max_length=255) news_type_chices = ( (1, '图片'), (4, '挨踢1024'), (3, '段子'), ) news_type = models.IntegerField(choices=news_type_chices)
# 查看所有新闻
new_list = News.objects.all()
for row in new_list:
print(row.title,row.summary, row.get_news_type_display() )
举例二:用户和用户类型
一:连表设计
class UserType(models.Model): """ 用户类型表,个数经常变动 """ title = models.CharField(max_length=32) class UserInfo(models.Model): """ 用户表:讲师和班主任 """ username = models.CharField(max_length=32) password = models.CharField(max_length=64) email = models.CharField(max_length=32) ut = models.ForeignKey(to="UserType")
二:不连表设计:choices
class UserInfo(models.Model): # """ # 用户表 # """ username = models.CharField(max_length=32) password = models.CharField(max_length=64) email = models.CharField(max_length=32,verbose_name="邮箱") user_type_choices = ( (1, '班主任'), (2, '讲师'), ) user_type_id = models.IntegerField(choices=user_type_choices)
四、登录
可设置一个装饰器
def auth(func): def inner(request,*args,**kwargs): is_login = request.session.get("is_login", None) if not is_login: return redirect("/login/") ret = func(*args,**kwargs) return ret return inner
需要注意的:
1、action不写路径,默认提交到当前
2、向后台提交数据用post,获取数据用get
3、submit一般加上value,有些浏览器可能会不识别
4、一般配置文件的键都是大写的