Djangoのヒント(2)

昨日要約
1.choicesパラメータ
クラスのUserInfo(models.Model):
ユーザ名= ...
年齢= ...
gender_choice =(
。(1、'男性')、
(2 '女性')、
(3、 'その他'。 )

性別= models.IntegerField(選択肢= gender_choice)
上記の値は、それまでにできるとき番号が対応関係に格納されている場合#性別番号
user_obj.gender#デジタル
user_obj.get_gender_display()#をするものと解釈されます説明対応する番号
あなたが取得する場合#は数字はメモリ自体またはデジタルの範囲外である
と2.MTV MVCモデル
MTV:
M:モデル
T:テンプレート
V:ビュー
MVC:
M:モデル
V:ビュー
C:コントローラの
本質:MTVの事実また、MVCの
3.ajax(******)
非同期提出
パーシャルリフレッシュ
我々は良いパッケージを学んできたアヤックスは、jQueryの簡易版に基づいています
あなたは、AJAXを書くときに必ずjQueryをインポートすることができます
。1.書き込みに独自の計算機能
2.ajax基本的な文法構造が
$アヤックス({
「」、#現在のデフォルトの方に書かない要求を送信し、バックエンドに向けて取り組む指定:URLをアドレスは送信
、「ポスト」#の提出は、指定:タイプ
データ:{「ユーザ名」:「ジェイソン」、「パスワード」:「123」}、
成功:機能(データ){参照してください#は、バックエンドは非同期で返されます結果が送信
#非同期コールバック機構論理処理コード
}
})
フォーマット4.前面および送信データの後端コード
エンコーディング・フォーマット・タイプを
1.urlencoded
2.formdata
3.Application / JSON
形式フォーム
フォームフォームデフォルトの符号化形式がURLエンコードされた
URLエンコードエンコード形式データ特性は、
ジェイソン・パスワードをユーザ名123年齢= 18です&&= =
#Djangoのデータ形式を自動的に解析し、あなたが反対request.POSTをカプセル化されたURLエンコードバックエンド
あなたはENCTYPEパラメータ開発することによって、フォームのフォームを変更することができ、データ#の提出エンコード形式
#フォームフォームの送信をファイルのフォーマットをエンコードするときにデフォルトいるFormDataを変更している必要があります
「」「
それはまた、ファイルをアップロードすることができ、通常のキーと値のペアを渡すことができます
限り、自動的にrequest.POSTに解析されたデータのurlencoded形式と一致しているとのためのDjangoのバックエンドが
ファイルを解析し、データのrequest.FILESを置く
「」 "
Ajaxのデフォルトのデータ符号化フォーマットもURLエンコードされているが
、ポストジャンゴを送信するためのAJAXリクエストを意味しますデフォルトはrequest.POSTによって取得されたバックエンドデータである
データを送信するためのAJAX、JSON形式
のフロントエンドによって送信されたデータの符号化フォーマットを表示する方法について?
コンテンツタイプパラメータは、リクエストヘッダにある
"「」
前後端インタラクティブデータは符号化データが存在しなければならない場合一貫フォーマット
「」 "
手動で符号化フォーマットを指定する1つの必要
のcontentType:『ファイルアプリケーション/ JSONを』
データフォーマットのJSONと一致していることを確認し2.
データ:JSON.stringify({『ユーザ名』:『ジェイソン』})
ジャンゴバックエンドのデータのJSON形式は、任意の治療がrequest.bodyでそのままになりますするつもりされていないため
、手動でのデータ処理を取得するために行くことができます
JSON形式の文字列に変換1バイトタイプ
2.使用JSONモジュールJSONを。アウトデシリアライズ負荷
AJAXファイル転送
AJAXは、ファイルを転送するために必要なJS組み込みオブジェクトいるFormData
このオブジェクトは実施することが可能であり、request.POST Djangoのファイルに共通の鍵にもジャンゴrequest.FILESの後端に後端を運ぶことができる
#1 FORMDATAは現在、ターゲット生成
;)(=いるFormData新新をMyFormData VARを
#2は、共通の追加しますキーと値のペア
MyFormData.append( 'ユーザ名'、 'ジェイソン');
MyFormData.append( 'パスワード'、 '123');
#3. [ファイルの追加
VAR fileobjの= $( '#myfileという ')[0] .files [ 0];
MyFormData.append( 'MYFILE'、fileobjの)
"" "
入力されたタグに格納されたファイルの種類をアップロードするユーザーを取得する方法=ファイル
" ""
$アヤックス({
URL: ''、
タイプ: 'POST'、
データは: MyFormDataは、
#は、手動で2つの重要なパラメータを指定する必要がある
のcontentTypeを:falseに、
PROCESSDATA:偽に
成功:機能(データ){
...
}
})
シリアライゼーションコンポーネント
django.core imprtのseralizersから
= models.Userinfo.objects.all user_queryset()
RES = seralizers.Seralizer( 'JSON'、user_queryset)
"" "
RESの= [{}、{}、{}]
" ""
(RES)のHttpResponseを返す
のAjax + sweetalert
今日SUMMARY
一括挿入データ
bulk_createの
データブック1000年挿入する#1
の範囲内のIのための#を(1000):#を挿入するには、この非効率的な方法
#models.Book.objects.create(タイトル=「%sの著書の」 I%)
book_list = []
の範囲でiに対する(100000):#時間は2偉大間の非常に短い間隔で
book_list.append(models.Book(タイトル= '%sの本の' %i)を)
models.Book。 objects.bulk_create(book_list)#バルク挿入データ
#フロントエンドから2だけ挿入されたデータの問い合わせを表示する
)(book_queryset = models.Book.objects.allを
レンダリング(要求、「のindex.html」を返します地元の人について())
カスタムフィニッシャー
焦点は、あなたが習得することはできませんコードのアイデアプッシュすることです
PY過ぎ直接コピー新しいコードファイルのカスタムフィニッシャーの使用を
バックエンド
app01.utils.mypageインポートページ区切りから
パッケージページングコード使用して#
DEFにログイン(要求):
book_queryset models.Book.objects.all =()
CURRENT_PAGE = request.GET.get( 'ページ' ,. 1)
aLL_COUNTはbook_queryset.count =()は、
オブジェクトの1例発生#
page_obj =改ページ(CURRENT_PAGE = CURRENT_PAGE、 all_count = all_count)
実際のデータスライスの2#
page_queryset = book_queryset [page_obj.start:page_obj.end]
地元()について、 'login.htmlと'リクエスト)レンダリング戻り
遠位
{page_queryset%以下でbook_obj用%}を

{{}} book_obj.title


ENDFOR %%} {
{{page_obj.page_html |安全}}
テーブル間の三つの方法、多くの関係を作成するには
1.自動(推奨
利点をDjangoのORMは自動的にあなたが第三のテーブルを作成するのに役立ちますということです
が、それは唯一の意志あなたは、余分なフィールドを追加しませんフィールドの2つのテーブル間の関係を作成するのに役立つことは
便利ですが、貧しい人々のスケーラビリティ3番目のテーブルには、追加のフィールドを追加して自由にすることはできません
クラスBook(models.Model):
...を
= models.ManyToManyField著者に(=「著者」まで)
クラスの著者(models.Models):
2。純粋なマニュアル(推奨されません)
の利益が第三の表は、任意のフィールドを追加することができている
欠点は、ORMのクエリメソッドは、支援クエリの多くでないときということですときに、非常に厄介な
クラスブック(models.Model):
クラスの著者(models.Models):
クラスBook2Author(models.Model):
book_id = models.ForeignKey(= '帳'へ)
AUTHOR_ID = models.ForeignKey(=「著者「)
CREATE_TIME = models.DateField(auto_now_add = TRUE)
自動3.(推奨
****)
手動でテーブルを構築するが、あなたはあなた自身の構築されていますORM第三のテーブルを教えてくれます
ORMはちょうど私が問い合わせの便利な方法を提供与える
クエリメソッドを使用することができますが、第三のORMを
が、の使用はサポートされません
)(追加する
(SETを)
削除()
クリア()
クラス帳(models.Model):
著者= models.ManyToManyField(= '著者'と、= 'Book2Author'を介して、through_fields =( 'ブック'、 '著者'))
クラスの著者(モデル。モデル):
本= models.ManyToManyField(= 'Book2Author'を介し= '帳'に、through_fieldsは=( '著者'、 'ブック'))
クラスBook2Author(models.Model):
ブック= models.ForeignKey(= 'へブック')
=に、著者= models.ForeignKey('著者「)
CREATE_TIME = models.DateField(auto_now_add = TRUE)
#1。半自動の2つの追加パラメータを追加する必要があります
=「Book2Author」、through_fieldsは=を通じて (「本」、「著者」)
フィールドの後ろにシーケンス#2
第三のテーブルから、以前に行われた場による単一テーブルのクエリフィールド、その上で
設計プロジェクトでは、自分自身を与える必要がありますその後の反復更新を防止するために後方に行く
のフォーム検証キット
1.登録機能
、ユーザが入力したユーザー名が、マーシュの無法者を含めることはできません
あなたはそれがコンテンツを入力するようユーザーに促し含まれている場合は、社会主義のコアバリュー満たしていない
3より小さくすることはできません、ユーザーが入力したパスワードを
場合以下の3つのパスワード、ユーザパスワードが短すぎるプロンプト
(******)
検査データは、通常はフロントで、後端部がチェックしてい
その後もなく、不要フロントチェックを回帰し
、エンドをバックも検証を持っている必要がありますとにかく、単語のフロントエンドは、バックエンドの検証がチェックしなければならない可能性があり!
1.ページをレンダリング>>>フロントページの設定
2.データの検証を取得>>>フロントエンドユーザーによって提出されたデータをチェックし
、データの3.結果は>>>ユーザーが閲覧表示するには、フロントページをチェックし、エラーメッセージを表示するように
フォームコンポーネントをそれは自動的にあなたが上記の3つの事柄に完了することができます
。1.レンダリングページ
2.チェックデータ
3.ショーのエラーメッセージ
フォームコンポーネントを使用して
1.自分が最初のクラスの書き込みに
はDjangoのインポートフォームから
クラスMyRegForm(forms.Formを):
= forms.CharFieldユーザー名(= MIN_LENGTH。3、MAX_LENGTH = 8)
パスワード= forms.CharField(MIN_LENGTH。3 =、= MAX_LENGTH。8)
メールforms.EmailField =(で)
データをチェックする方法
app01インポートビューから
カスタマイズするには#1。辞書のクラス通過
OBJ = views.MyRegForm({ 'ジェイソン'、 'パスワード':'12である、「メールに'123' 'ユーザ名'})
#2のすべての有効なデータか否かを判断する
obj.is_valid()位データは、コンプライアンスになりますすべてが真である
[4]:偽アウト
#3ビューデータ検証ルールが準拠
obj.cleaned_data
アウト[5]:{「ユーザ名」:「ジェイソン」}
#4を参照してください資格データ、およびどのような不適合の原因は
obj.errors
アウト[6]:
{
'パスワード':[ 'Ensure®少なくともこの値は3文字(ITは2を持っている)がある。。']、
[電子メールでの':[' 有効なメールアドレスを入力します。 ']
}
チェックデータ#デフォルトクラス時に値によって渡される必要があり、すべてのフィールド
OBJ = views.MyRegForm({「ユーザ名」:「ジェイソン」、「パスワード」:「123」})
obj.is_valid()
アウト偽:12である]
obj.errors
OUT [13である]:{ 'メールに':[ 'これは必須フィールドである。']}
デフォルト#6を通過することができるが、以下、複数のパスであってはならない
OBJ = views.MyRegForm({[ユーザ名':' ':' 1233 ''メールに':' [email protected] '' XXX ':'ジェイソン''パスワードOOO「})は、
()をobj.is_valid
アウト[15]:真の
ページをレンダリングする方法
1.formsコンポーネントは手動で記述する必要がある送信ボタンにラベルを付ける(...入力、選択し、ドロップダウンボックス)を使用すると、ユーザー入力を取得助けをレンダリングします

スリーウェイのフロントページをレンダリング


最初のフロントページのレンダリング:高すぎるレベルパッケージスタイルタグと便利調整パラメータ乏しいスケーラビリティ(推奨)
{form_obj.as_p} {}
{} {} form_obj.as_ul


ページをレンダリングする2番目の方法:あなたが手で書かれたコード(推奨しません)以上のものを必要とする高いスケーラビリティでは不十分



{{form_obj.username.label}}、{{}} form_obj.username



{{form_obj.password.label}}、{{}} form_obj.password



{{form_obj.email.label}}、{{}} form_obj.email


道のフロントページの第3の描画:コードとスケーラビリティの量が高い(推奨)


{form_obj%でfooの%}

{{foo.label}}、{{FOO}}


{%ENDFOR%}
どのようにエラーメッセージを表示する
私たちが形成するようにパラメータを追加するためのフォームをチェックしますか助けるためにフロントエンドをキャンセルする方法を

エラー情報の表示対象点errors.0

form_objにfooの{%}%


{{foo.label}}:{{FOO}}
、{{}} foo.errors.0


{%ENDFOR%}


フォームからジャンゴインポート
クラスMyRegForm(forms.Form)
名= forms.CharField(MIN_LENGTH 3 =、= MAX_LENGTH 8、ラベル= 'ユーザ名'、
error_messages、= {
'MIN_LENGTH': '名最短3'、
「MAX_LENGTH ':'名最大8 '
'必要':'ユーザー名は空にすることはできません'
}、初期=' I「の初期値、必要= Falseです

。パスワード= forms.CharField(MIN_LENGTH 3 =、= 8 MAX_LENGTH 、ラベル= 'パスワード'、error_messages、= {
'MIN_LENGTH': '最小パスワード3'、
'MAX_LENGTH': 'パスワードの最大8'、
'必要': 'パスワードを空にすることはできません'
})
メールに= forms.EmailField (ラベル=「メール」、error_messages、= {
「必要な」:「Eメールを空にすることはできません」、
「無効」:「メールボックス形式が正しくありません」
}、偽=必須)
部品のフック関数をフォーム
あなたもフック関数で必要とされる追加の検証を行うことができますフィールドの

局部钩子
    # 当你需要对某一个字段数据进行额外的一些列校验 你可以考虑使用钩子函数
    # 针对单个字段的  使用局部钩子
    def clean_username(self):
        username = self.cleaned_data.get('username')
        if '水浒传' in username:
            # 给username字段下面提示错误信息
            self.add_error('username','用户名不符合社会主义核心价值观')
        return username
全局钩子
    # 针对多个字段的校验 使用全局钩子      eg:校验两次密码是否一致
    def clean(self):
        password = self.cleaned_data.get('password')
        confirm_password = self.cleaned_data.get('confirm_password')
        if not password == confirm_password:
            self.add_error('confirm_password','两次密码不一致')
        return self.cleaned_data

ボックス型の属性値の入力を変更する方法
)ウィジェット= widgets.TextInputを(
ウィジェット= widgets.PasswordInput()
アセンブリは、入力ボックスがフォームコントロールクラスの属性をレンダリングした構成にする方法を
ウィジェット= widgets.TextInput(attrsに= {「クラス」: 「フォームコントロール他人}) #スペースで区切られた複数のクラスが存在する場合属性
ウィジェット= widgets.PasswordInput(ATTRS = {「クラス」: 'フォームコントロール他人})
各フィールドは、さらに定期的なチェックをサポートしている
Djangoのインポートからフォームの
`` django.forms``インポートフォームから
django.core.validatorsインポートRegexValidatorから

class MyForm(Form):
    user = forms.CharField(
        validators=[RegexValidator(r'^[0-9]+$', '请输入数字'), RegexValidator(r'^159[0-9]+$', '数字必须以159开头')],
    )

おすすめ

転載: www.cnblogs.com/abdm-989/p/11761915.html