djangoでの文字列フィールドの代表的なCharFieldとTextFieldについて解説します
CharFieldとTextFieldの違いやそれぞれの引数,Formへの適用方法などを簡単に紹介しています
CharField
小~大の文字列を扱うフィールドです
フォームウィジェットはデフォルトでTextInputになります
CharFieldの引数は2つ用意されていますので以下に説明していきます
CharField.max_length
この引数は必須で,フィールドの最大文字数を指定します
max_lengthはデータベースレベルと,djangoのMaxLengthValidatorで強制されます
実際にValidationされるところを見ていきましょう
blog/models.pyにお問い合わせ用のクラスを作ります
class Contact(models.Model):
title = models.CharField(max_length=100)
このようにお問い合わせフォームのタイトルをmax_length=100にします
日本語ダミーテキスト生成器というものでテキストを生成します
まずは100文字です
木曾路はすべて山の中である。あるところは岨づたいに行く崖の道であり、あるところは数十間の深さに臨む木曾川の岸であり、あるところは山の尾をめぐる谷の入り口である。一筋の街道はこの深い森林地帯を貫いていた
tool.stabucky.com/convert/dummy_text_generator.htm
これでそのままメールアドレスや内容を打ち込んで送信すると,成功したことがわかります
次に200文字で,Validationされるようにします
木曾路はすべて山の中である。あるところは岨づたいに行く崖の道であり、あるところは数十間の深さに臨む木曾川の岸であり、あるところは山の尾をめぐる谷の入り口である。一筋の街道はこの深い森林地帯を貫いていた。東ざかいの桜沢から、西の十曲峠まで、木曾十一宿はこの街道に添うて、二十二里余にわたる長い谿谷の間に散在していた。道路の位置も幾たびか改まったもので、古道はいつのまにか深い山間に埋もれた。名高い桟も、
tool.stabucky.com/convert/dummy_text_generator.htm
メールアドレスや内容を打ち込んで送信します
するとsuccess_urlにリダイレクトせず,失敗します
しかし,このままではよろしくないので,Validationのメッセージが表示されるようにします
CharField.max_lengthのエラーメッセージ
MaxLengthValidatorをimportしてCharField内で使用します
from django.core.validators import MaxLengthValidator
class Contact(models.Model):
title = models.CharField(
max_length=100,
validators=[MaxLengthValidator(100, '入力文字数は100文字以内にしてください')])
次にテンプレート側で受け取ります
templates/blog/contact.htmlにエラーメッセージを追加します
<form method="POST" class="mx-3 mx-md-5">{% csrf_token %}
{% for item in form %}
<div class="form-group mb-3 fs-5">
<label for="{{item.id_for_label}}">{{item.label}}</label>
{% if item.name == "content" %}
<textarea class="form-control" {% if item.field.required %}required{% endif %} name="{{item.name}}" id="{{item.id_for_label}}" rows="3"></textarea>
{% else %}
<input type="{{item.field.widget.input_type}}" class="form-control"
{% if item.field.required %}required{% endif %}
name="{{item.name}}" id="{{item.id_for_label}}">
{% endif %}
</div>
{% for error in item.errors %} # このエラーメッセージを追加
{{ error }}
{% endfor %}
{% endfor %}
<div class="py-3">
<button class="btn btn-primary btn-lg w-100" type="submit">送信</button>
</div>
</form>
最後にblog.forms.pyを編集します
class ContactForm(forms.ModelForm):
class Meta:
model = Contact
fields = ['title', 'email' , 'content']
labels = {
'title':'題目',
'email': 'メールアドレス',
'content':'内容',
}
error_messages = {
'title': {
'max_length': '100文字以内で入力してください'
}
}
変更したらdjangoに反映させちゃいます
コマンドプロンプトで下記コードを実行しましょう
python manage.py makemigrations blog
python manage.py migrate
開発用サーバーを立ち上げて,お問い合わせフォームに入力します
エラーメッセージがあることがわかります
また,MySQLにおいて,VARCHAR列タイプを持つフィールドにunique=Trueを使用している場合,max_lengthが255文字に制限されることがあります
CharField.db_collation
この引数はdjango3.2から新機能でオプションで,フィールドのデータベース照合名です
カラムの照合設定は,データのソート順や,どの文字列が等しいと比較するかを制御します
TextField
多量のテキスト用のフィールドでで,デフォルトのフォームウィジェットはTextareaになります
引数でmax_lengthを指定した場合,自動生成されたフォームフィールドの Textarea ウィジェット内で反映されます
ただ,モデルやデータベースに反映されません
その際はCharFieldを使用しましょう
参考文献
結論はいっぱいテキストあるときTextField使ってくださいね
コメント