ジャンゴ---作成した多くの関係、フォームコンポーネント

多くの-な方法を作成するには、3つの方法

直接のシステムを作成します。1.

あなたは第三のテーブルを作成するために、システムのテーブルを作成すると、

利点:

1.システムは、CRUDを運ぶ使用することができます

手動でテーブルを作成する2.不要になりました

短所:

1.、変更を加えることは決して外にテーブルを作成し、スケーラビリティの悪いです

authers = models.ManyToManyField(to='Auther')

2.手動では、独自に作成します

あなたは最高の時間対多の関係は、テーブル内のデータは、データの信頼性を確保するように拘束された時にテーブルを作成し、自分のニーズに応じて第三のテーブルを作成することができます。

利点:

1.テーブルを作成することは、その用途に応じて変更することができます

2.高いスケーラビリティ

短所:

1.マルチテーブル操作を使用する方法はありません、あなたは修正するために多くの、1の方法を使用することができます

2.クロステーブルのクエリをサポートしていません。

class AutherBook(models.Model):
    auther = models.ForeignKey(to='Auther') 
    book = models.ForeignKey(to='Book')

自分の定義システムを作成し、追加3。

自分でテーブルを定義し、その後、システム定義のテーブルのポイントは、自分のテーブルを設定します。

利点:

1.あなたは、テーブル内のフィールドを変更することができます

2.サポートクロステーブルクエリ

短所:

1.マルチテーブル操作をサポートしていません

authers = models.ManyToManyField(to='Auther',through='AutherBook',through_fields=('book','authers'))

# through  指定自己创建的第三张表
# theough_fields   指定第三张表中与之关联的字段,有顺序要求,定义的外键字段在谁那里,就先写谁

フォームコンポーネント

フォームコンポーネントの主な機能:

1.利用できるHTMLタグを生成することができます

利用者から提出された。2.データを検証します

3.最後の入力内容をキープ

フォームのコンポーネントは、これらの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.チェックデータフォームアセンブリ

  1. クラスに書き込まれ、辞書データ転送(データは検証される)オブジェクトが較正されるインスタンス。
  2. obj.is_valid()検査データを表示することは正当です。
  3. obj.errorsは、フィールドを参照し、間違った理由のための規則に準拠していません。
  4. obj.cleaned_data検証ルールに沿ったデータを表示します。

注意!

  1. アセンブリフォームを使用する場合、記述されたフィールドのデフォルトクラスが少ない質量できない値で渡すことと定義されます。
  2. フォームは、アセンブリ、クラスで定義されているのみチェックフィールドを形成しています。あなたは、マルチパス、および任意の効果を持っていない場合。

コンポーネントのラベルをレンダリングする3.フォーム

特長:

フォームを使用して、送信ボタンをレンダリングする助けにはなりません、あなたがコンポーネントラベルのgetユーザーの入力をレンダリングするのに役立ちます、手動で追加する必要があります。

ラベルモード1をレンダリング:

{{ form_obj.as_p }}  // 里面所有标签都有

ラベルをレンダリングする2 :(方法が推奨されていません、)各行は、独自のを記述する必要があり、より多くのトラブルを書きます

{{ form_obj.username.label }}{{ form_obj.username }}  // 只有username一个标签

私が使用し、プラスボタンを提出することを覚えているときレンダリングラベル)は、道:( 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

定期点検データ形式が一致することにより、

# 需要先导入RegexValidator模块
from django.core.validators import RegexValidator
validators=[
    RegexValidator(r'^[0-9]+$', '请输入数字'),
    RegexValidator(r'^159[0-9]+$', '数字必须以159开头'),
]

ウィジェット:5.3は、入力ボックスにスタイルとプロパティを設定します

あなたがラベルウィジェットクラスの属性やスタイルCSSで変更することができます

  1. 密码パスワード:ウィジェット= forms.widgets.PasswordInput()
  2. 单选radioSelect:ウィジェット= forms.widgets.RadioSelect()
  3. 多选選択:ウィジェット= forms.widgets.SelectMultiple()
  4. 单选チェックボックス:ウィジェット= forms.widgets.CheckboxInput()
  5. 多选チェックボックス:ウィジェット= 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

おすすめ

転載: www.cnblogs.com/whkzm/p/11980639.html