1.自動(推奨*)
利点:あなたが手動で第三のテーブルを作成する必要はありません
、あなたは手動で作成したよりも、3番目のテーブル以来3番目のテーブルが固定されることを意味し、フィールドの拡張を行うことはできません。不足しています
クラスブック(models.Model): タイトル = models.CharField(max_lengthを= 32 ) 価格 = models.DecimalField(max_digits = 8、decimal_places = 2 ) 著者(=へ= models.ManyToManyField ' 著者' ) クラスの著者(models.Model ): 名前 = models.CharField(MAX_LENGTH = 32)
2.ピュアマニュアルは(理解して)
独自の第三のテーブル作成
の利点を:第三拡張フィールドは任意のものとすることができる
不足:ORMクエリは便利ではありません
クラスブック(models.Model): タイトル = models.CharField(max_lengthを= 32 ) 価格 = models.DecimalField(max_digits = 8、decimal_places = 2 ) クラスの著者(models.Model): 名前 = models.CharField(max_lengthを= 32 ) クラスBook2Author(models.Model): ブック = models.ForeignKey(=に' ブック' ) の著者(=へ= models.ForeignKey ' 著者' ) CREATE_TIME = models.DateField(auto_now_add =真)
3.半自動(******推奨)
利点:2つの純粋な自動と手動の利点を組み合わせました
クラスブック(models.Model): タイトル = models.CharField(max_lengthを= 32 ) 価格 = models.DecimalField(max_digits = 8、decimal_places = 2 ) 著者 = models.ManyToManyField(=に' 著者' =通じ、' Book2Author '、 through_fields =(' ブック'、' 著者' )) クラスの著者(models.Model): 名前 = models.CharField(max_lengthを= 32 ) クラスBook2Author(models.Model): ブック = models.ForeignKey(=に" ブック' ) 著者 = models.ForeignKey(=に' 著者" ) CREATE_TIME = models.DateField(auto_now_add =真)
基本的なコンポーネントの使用状況を形成
ジャンゴインポートフォーム クラスLoginForm(forms.Form): 名(。。= MAX_LENGTH 8、MIN_LENGTH = 3)= forms.CharField #1 名最短最長8つの3 パスワード= forms.CharField(MAX_LENGTH = 8、 MIN_LENGTH = 5) #パスワードの最大8最小5通の メールforms.EmailField =() #のメールは、メールボックス形式でなければなりません
基本的な使用
コンソールpyton検証で
から app01 インポートビュー 。1は、クラスオブジェクトのインスタンスにデータを検証するカスタム辞書のようにして生成される。 Form_obj = views.LoginForm({ 「ユーザ名」:「ジェイソン」、「パスワード」:「123 」、「電子メール」:「123 」}) 2 。すべての法的データかどうかを確認する方法 form_obj.is_valid() #のみすべてのデータが要件に沿ったものであるがTrueになります Falseの 3 エラー原因を表示する方法。 form_obj.errors { " パスワード":[ 「Ensure®少なくともこの値を有する5つの文字(それが有する3)。」]、 「メールに」:[ 「メールアドレスに有効なを入力してください。」] } 4。データ検証を表示する方法。 Form_obj.cleaned_data { ' ユーザ名':' ジェイソン" }
注:
すべてのフィールド1.カスタムクラスは、デフォルト値の合格するために必要な
フィールド名を定義しない場合があり、追加の着信クラスがチェックを行っていない構成要素を形成2.マルチパスが何もなかったことを意味します
レンダリングページ
<P>ページをレンダリングするための最初の方法(ローカルテストは、一般的に適用できないため、カプセル化の高い度合いは、一般的に使用される)</ P> {form_obj.as_p} {} {} {form_obj.as_ul} {} {} form_obj.as_table <P>第2の実施形態のページ(より高いスケーラビリティトラブル書き込み)をレンダリングすることである</ P> <P> form_obj.username.label {} {} {} {} form_obj.username </ P> <P> { form_obj.password.label {} {} {}} form_obj.password </ P> <P> {{{{form_obj.email.label form_obj.email}}}} </ P> <P>第3ページにレンダリングされますファッション(推奨)</ P> {%ため FOO で form_obj%} <P> foo.label {} {} {} {} FOO </ P> {%} ENDFOR%
注
1.formsコンポーネントを使用すると、手動で追加する必要があるときにあなたを助けるためにページをレンダリングする際にユーザー入力を取得するためにラベルをレンダリングします送信ボタン
大文字の最初の文字と、デフォルトが指定されていないクラスのフィールドケース2.inputコメントボックスのラベルを
ブラウザ遠位キャンセルチェック機能の
属性がNOVALIDATEを指定するフォームタグ
<フォームアクション=「」メソッド= 「ポスト」NOVALIDATE> </フォーム>
エラーメッセージを表示
フロント
<フォームアクション= ""メソッド= " ポスト" > {%ため FOO で form_obj%} <P> {{foo.label}}:{{FOO}} <スパン> {{foo.errors.0}} </スパン> </ P> {%ENDFOR%}
バックエンド
= forms.CharFieldパスワード(= MAX_LENGTH 8、MIN_LENGTH = 5、ラベル=。。' パスワード'、error_messages、= { ' MAX_LENGTH ':' パスワード最大8 ' 、 ' MIN_LENGTH ':' パスワードの最小5 ' 、 ' 必要':' パスワードを空にすることはできません' }、必要な偽=、= [RegexValidator(R&LTバリ' ^ [0-9] + $は' '番号を入力してください")、RegexValidator(R&LT ' ^ 159 [0-9] + $ '、' 数が159を起動する必要があります')]) #のパスワード最短、最長8 5
フック関数(HOOK)
使用方法:への書き込みのカスタムクラスメソッドの形式では #ローカルフック(フィールドの追加の検証を行う)ヒントを一度に含まれるユーザ名666を検証することはできません DEF :(自己を)clean_username 名 = self.cleaned_data。 (GET 「ユーザ名」) IF 「666 」 で、ユーザ名: self.add_error(「ユーザ名」、「光はあなたが所有しなければならない上666を呼び出すのに十分ではありません」) の戻りユーザ名 #グローバルフックを(複数のフィールドのための余分なチェックを行うため)ユーザーパスワードかどうかをチェック倍一貫した DEF クリーン(セルフ): パスワード = self.cleaned_data.get(「パスワード」) confirm_password = self.cleaned_data.get(' confirm_password ' ) の場合 ではないパスワード== confirm_password: self.add_error(' confirm_password '、' 两次密码不一致' ) の戻り self.cleaned_data
クッキーとセッション
によるHTTPプロトコルにはステートレスであるユーザの状態を記録することはできません
クッキーのキーは、クライアントのブラウザに保存されている
作品:あなたが成功し、ブラウザ上の情報の一部を保存してログインし、次の時間を訪問するとき、それはサーバ情報を介してサーバにアクセスするには、この情報を取得しますあなたの身元識別するために
クッキーを、クライアントのブラウザで書かれてますが、サーバーが設定されているものの、ブラウザが書き込みクッキーの禁止命令に従わないように選択することができる
ため、サーバー上に保存されたセッションキーを
ただし、サーバー上に保存されたセッション右側のキーが、それはクッキーの仕事に依存しているが、サーバーがブラウザにランダムな文字列を返す、キーと値のペアの形式でブラウザ店は
SESSIONID:ランダムな文字列を
ブラウザにサーバーにアクセスしたときになりますランダムな文字列の運搬は、後端部の後端が一致しないランダムな文字列のレコードを取得し
、ランダムな文字列を1:1つのデータ
のランダムな文字列2:データ2
设置セッションますrequest.session [ '名前'] = 'ジェイソン'
获取セッションrequest.session.get( '名前')
Djangoのセッションのデフォルトのタイムアウトは14日です
django_sessionテーブルブラウザのレコード
request.session.delete()#のセッションID情報は、ブラウザを削除されます
request.session.flush()#は、すべてのブラウザとサーバを削除します
セッションセッションとクッキーのタイムアウト設定
request.session.set_expiry(値)
値が整数である場合は*を、セッションは秒のいくつかの数の後に期限切れになります。
*値はdatatimeかはtimedeltaである場合、セッションはこの時間の後に期限切れになります。
値が0の場合は*、ユーザーがブラウザセッションが失敗します閉じます。
*値がNoneの場合、セッションがグローバルセッション有効期限ポリシーに依存します。