多くの多くの方法を作成するには、3つの方法、
1.自動
カプセル化、さらに悪い拡張性の度合いが高いです。
class Book(models.Model):
title = models.CharField(max_length=32)
# 直接建立多对多关系字段
authors = models.ManyToManyField(to='Authors')
class Authors(models.Model):
name = models.CharField(max_length=32)
利点:
- 自分の第三のテーブルを操作する必要はありません、すべて自動的にORMを作成するのに役立ちます。
- また、構築された4つのテーブルの第三の方法の操作:追加、削除、セット、クリアな。
不十分:
- 第三の表は、変更されたフィールド、テーブルのスケーラビリティの貧困層を作成し、自動的に拡張することができません。
2.純粋な手のラインと(理解)
自分自身の手によって完全に第三のテーブルを作成します。
class Book(models.Model):
title = models.CharField(max_length=32)
class Authors(models.Model):
name = models.CharField(max_length=32)
class Book2Authors(models.Model):
book = models.ForeignKey(to="Book")
author = models.ForeignKey(to="Authors")
create_time = models.DateField(auto_now_add = True)
利点:
- フィールドとフィールド名のすべての数の3番目のテーブルには、独自に定義することができます。
不十分:
- ORMクロステーブルクエリはもはやサポートされている、もはや正と負の概念がありません。
- これは、追加、削除、セット、ビルトイン方式明確4をサポートしていません。
3.半自動(推奨)
あなたのケースはのManyToManyFieldにのみ1つのパラメータがある場合は、ORMは自動的に第三のテーブルを作成するのに役立ちます。
あなたが通過してthrough_fields追加すると、ORMは自動的に第三のテーブルを作成するのに役立ちませんが、それはあなたがクエリがORMクロステーブルを使用し続けることができそうという、社内の関係を維持するのに役立ちます。
経由:自分の指定した第三のリレーショナルテーブル
through_fields:自身の指定第リレーショナルテーブル二守備テーブルのフィールドとテーブルとの間のエンド対多の関係です。
順序が逆に問題になります
class Book(models.Model):
title = models.CharField(max_length=32)
# 多对多关系字段
authors = models.ManyToManyField(to='Authors',through='Book2Author',through_fields=("book","authors")) # 这两个字段是有顺序的
class Authors(models.Model):
name = models.CharField(max_length=32)
# 多对多关系字段 等价
# books = models.ManyToManyField(to='Book', through='Book2Author', through_fields=("authors","book"))
class Book2Author(models.Model):
book = models.ForeignKey(to='Book')
authors = models.ForeignKey(to='Authors')
# 该表中可以由任意多的外键字段
# 可以扩展任意的字段
利点:
- あなたは、スケーラビリティを第三のテーブル内のすべてのフィールドを追加して変更することができます。
- サポートORMクロステーブルのクエリ
不十分:
- 内蔵の方法4をサポートしていません:追加、削除、セット、クリアな。
二、フォームコンポーネント
フォームのフロントエンドのフォームがバックエンドに向けてタグデータを送信するために使用され、彼はこの次のもののいくつかを実行する必要があります。
- レンダリングタグ:ページ生成されたHTMLタグを利用できます
- パリティデータ:ユーザチェックにより提出されたデータ
- 情報を表示します。前に入力内容を保存します
フォームのコンポーネントは、これらの3つの事の上良く完了することができます。
1.フォームコンポーネントを使用する方法
フォームはDjangoのモジュールを使用する必要があります
from django import forms
# 首先需要提前写一个类用来继承Form类,然后就可以通过这个类来
class MyForm(forms.Form):
# username字段 最少三位 最多八位
username = forms.CharField(max_length=8,min_length=3)
# password字段 最少三位 最多八位
password = forms.CharField(max_length=8,min_length=3)
# email字段 必须是邮箱格式
email = forms.EmailField()
2.チェックデータフォームアセンブリ
- クラスに書き込まれ、辞書データ転送(データは検証される)オブジェクトが較正されるインスタンス。
- obj.is_valid()検査データを表示することは正当です。
- obj.errorsは、フィールドを参照し、間違った理由のための規則に準拠していません。
- obj.cleaned_data検証ルールに沿ったデータを表示します。
# 使用pycharm中的python console进行测试。
from app01 import views
form_obj1 = views.MyForm({'username':'tbw','password':'12','email':'qq'})
form_obj2 = views.MyForm({'username':'tbw','password':'123','email':'[email protected]'})
# 查看校验对象是否通过校验
print(form_obj1.is_valid())
print(form_obj2.is_valid())
# 查看未通过校验的数据的具体错误
print(form_obj1.errors)
print(form_obj2.errors)
# 查看对象中通过了校验的数据
print(form_obj1.cleaned_data)
print(form_obj2.cleaned_data)
'''
False
True
{'password': ['Ensure this value has at least 3 characters (it has 2).'],'email': ['Enter a valid email address.']}
# 这里没有错误就什么都不打印
{'username': 'tbw'}
{'username': 'tbw', 'password': '123', 'email': '[email protected]'}
'''
注意!
- アセンブリフォームを使用する場合、記述されたフィールドのデフォルトクラスが少ない質量できない値で渡すことと定義されます。
form_obj = views.MyForm({'username':'tbw','password':'12345'})
form_obj.is_valid()
form_obj.errors
'''
False
{'email': ['This field is required.']}
'''
- フォームは、アセンブリ、クラスで定義されているのみチェックフィールドを形成しています。あなたは、マルチパス、および任意の効果を持っていない場合。
form_obj = views.MyForm({'username':'tbw','password':'12345','email':'[email protected]','xxx':'嘻嘻嘻'})
form_obj.is_valid()
'''
True
'''
コンポーネントのラベルをレンダリングする3.フォーム
ステップ:
- 後に空のオブジェクトを生成します
- フロントページのHTMLにオブジェクトを渡すには
- このオブジェクトは、フロントラベルでレンダリングされます
特長:
フォームを使用して、送信ボタンをレンダリングする助けにはなりません、あなたがコンポーネントラベルのgetユーザーの入力をレンダリングするのに役立ちます、手動で追加する必要があります。
ラベルモード1をレンダリング:
{{ form_obj.as_p }} // 里面所有标签都有
ラベルをレンダリングする2 :(方法が推奨されていません、)各行は、独自のを記述する必要があり、より多くのトラブルを書きます
{{ form_obj.username.label }}{{ form_obj.username }} // 只有username一个标签
{{ form_obj.password.label }}{{ form_obj.password }}
{{ form_obj.email.label }}{{ form_obj.email }}
ラベルをレンダリングする3つの方法:
{% for form in form_obj %}
<p>{{ form.label }}{{ form }}</p> <!--form 等价于你方式2中的对象点字段名-->
{% endfor %}
文字のレンダリングを表示するラベルを変更する:フィールドにラベル属性を追加します。
class MyForm(forms.Form):
username = forms.CharField(max_length=8,min_length=3,label='用户名')
password = forms.CharField(max_length=8,min_length=3,label='密码')
email = forms.EmailField(label='邮箱')
4.情報ディスプレイアセンブリフォーム
<form action="" method="post" novalidate>
{% for forms in form_obj %}
<p>
{{ forms.label }}{{ forms }}
<span>{{ forms.errors.0 }}</span>
error里面正好是一个一个标签对应的报错信息列表
.0 可以拿到里面的一个一个文本,
这样既可以随便在哪个位置展示了
</p> <!--form 等价于你方式2中的对象点字段名-->
{% endfor %}
<input type="submit">
</form>
チェックデータパラメータ
前端と後端のキャリブレーションデータは、一般的に持っている必要があります。
しかし、壊れやすいよう、チェック不要のフロントエンド。
バックエンドの検証が持っている必要があります!そして、我々は非常に包括的でなければなりません!
ブラウザのフロントエンドに伝えるためにどのようにチェックしません。
form表单中加一个novalidate参数即可
<form action="" method="post" novalidate>
5.1エラーメッセージの変更:error_messages
フロントページに表示されるエラーメッセージを変更することができ、データの各部分は、変形に対応することができます。
username = forms.CharField(
max_length=8,
min_length=3,
label='用户名',
initial='默认值',
error_messages={
'max_length':'用户名最长八位',
'min_length':'用户名最短三位',
'required':'用户名不能为空'
},
)
email = forms.EmailField(
label='邮箱',
error_messages={
'required':'邮箱不能为空',
'invalid':'邮箱格式错误' # 这条显示邮箱格式错误的报错信息
}
)
5.2バリ:バリ
異なるルールによるコンテンツフォーマットチェックデータ
# 需要先导入RegexValidator模块
from django.core.validators import RegexValidator
validators=[
RegexValidator(r'^[0-9]+$', '请输入数字'),
RegexValidator(r'^159[0-9]+$', '数字必须以159开头'),
]
ウィジェット:5.3は、入力ボックスにスタイルとプロパティを設定します
あなたがラベルウィジェットクラスの属性やスタイルCSSで変更することができます
- 密码パスワード:ウィジェット= forms.widgets.PasswordInput()
- 单选radioSelect:ウィジェット= forms.widgets.RadioSelect()
- 多选選択:ウィジェット= forms.widgets.SelectMultiple()
- 单选チェックボックス:ウィジェット= forms.widgets.CheckboxInput()
- 多选チェックボックス:ウィジェット= forms.widgets.CheckboxSelectMultiple()
password = forms.CharField(
min_length=6,
label="密码",
widget=forms.widgets.PasswordInput( ###
attrs={'class': 'c1'},
render_value=True
)
)
5.4入力ボックスのデフォルト値:初期
gender = forms.fields.ChoiceField(
choices=((1, "男"), (2, "女"), (3, "保密")),
label="性别",
initial=3, ###
widget=forms.widgets.RadioSelect()
)
5.5コントロールフィールド必須:必須
email = forms.EmailField(
label='邮箱',
error_messages={
'required':'邮箱不能为空', ### 默认为True,可以为空
'invalid':'邮箱格式错误'
}
)
5.6入力対応するメッセージ:ラベル
チェックボックスが選択されているラベル・タグを指すことができます
gender = forms.fields.ChoiceField(
choices=((1, "男"), (2, "女"), (3, "保密")),
label="性别", ###
initial=3,
widget=forms.widgets.RadioSelect()
)
6.フック関数
特定の時間に、特定のコンテンツをクロールします。
フック関数は、関数、あなたが任意のチェックコードを書くことができる関数本体です。
彼は自動的にすることで、データの検証後に実行呼ばれます。
6.1部分的なフック
関数の名前 clean_单个字段名
# 校验用户名中不能含有666
def clean_username(self):
username = self.cleaned_data.get('username')
if '666' in username:
# 给username所对应的框展示错误信息
self.add_error('username','光喊666是不行的')
# raise ValidationError('到底对不对啊')
# 将单个数据username数据返回
return username
6.2グローバルフック
関数の名前clean
、すべてのキーは、検証のための1つにcleaned_dataます。。
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