【django】モデルでCharFieldとTextFieldで文字列を扱う方法

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
100

これでそのままメールアドレスや内容を打ち込んで送信すると,成功したことがわかります

success_100

次に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

開発用サーバーを立ち上げて,お問い合わせフォームに入力します

eror

エラーメッセージがあることがわかります

また,MySQLにおいて,VARCHAR列タイプを持つフィールドにunique=Trueを使用している場合,max_lengthが255文字に制限されることがあります

CharField.db_collation

この引数はdjango3.2から新機能でオプションで,フィールドのデータベース照合名です

カラムの照合設定は,データのソート順や,どの文字列が等しいと比較するかを制御します

TextField

多量のテキスト用のフィールドでで,デフォルトのフォームウィジェットはTextareaになります

引数でmax_lengthを指定した場合,自動生成されたフォームフィールドの Textarea ウィジェット内で反映されます

ただ,モデルやデータベースに反映されません

その際はCharFieldを使用しましょう

参考文献

結論はいっぱいテキストあるときTextField使ってくださいね

シェアしてくださると嬉しいです!
  • URLをコピーしました!

コメント

コメントする

目次