

Djangoでユーザーが入力したテキストをDB中に保存して、新規データ登録時にDBから選択肢を呼び出す機能の実装をしようと考えています。models.pyの設定、forms.pyの設定には問題がないと考えているのですが、実際にブラウザで新規登録をテストすると初期値が設定されていないこともありエラー「正しく選択してください。選択したものは候補にありません。」と表示されDBへのデータ保存が出来ません。どのように初期の選択肢をDBに渡しておけばよいでしょうか？

models.py

[code]

    import datetime
    from django.db import models
    from django.conf import settings
    
    ITEM_TYPE_CHOICES = [('jacket','上着'),('shirt','シャツ'),('pants','パンツ'),('underpants','下着(下)'),('undershirt','下着(上)'),('socks','靴下'),('others','その他')]
    ITEM_COLOR_CHOICES = [('red','赤'),('blue','青'),('green','緑'),('yellow','黄'),('purple','紫'),('orange','橙'),('black','黒'),('white','白'),('grey','灰'),('beige','ベージュ'),('navy','ネイビー'),('brown','茶'),('others','その他')]
    SEASON_CHOICES = [('spring','春'),('summer','夏'),('fall','秋'),('winter','冬')]
    OCCASION_CHOICES = [('daily_use','普段着'),('work_wear','仕事'),('active_wear','よそ行き'),('sports_wear','スポーツ'),('other_use','その他')]
    FAVORITE_LEVEL_CHOICES = [(1,'めちゃ低い'),(2,'低い'),(3,'普通'),(4,'高い'),(5,'めちゃ高い')]
    ITEM_IMPORTANCE_CHOICES = [(1,'捨てれる'),(2,'悩む'),(3,'普通'),(4,'まあ大事'),(5,'めっちゃ大事')]
    
    
    class ItemType(models.Model):
        user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name='ユーザー', on_delete=models.CASCADE, null=True)
        create_date = models.DateTimeField(verbose_name='作成日', auto_now_add=True)
        item_type = models.CharField(verbose_name='アイテム種類', max_length=155, unique=True)
    
    
    class ItemColor(models.Model):
        user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name='ユーザー', on_delete=models.CASCADE, null=True)
        create_date = models.DateTimeField(verbose_name='作成日', auto_now_add=True)
        item_color = models.CharField(verbose_name='アイテムカラー', max_length=100, unique=True)
    
    
    class ItemBrand(models.Model):
        user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name='ユーザー', on_delete=models.CASCADE, null=True)
        create_date = models.DateTimeField(verbose_name='作成日', auto_now_add=True)
        item_brand = models.CharField(verbose_name='ブランド', max_length=155, unique=True)
    
    
    class PurchasePlace(models.Model):
        user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name='ユーザー', on_delete=models.CASCADE, null=True)
        create_date = models.DateTimeField(verbose_name='作成日', auto_now_add=True)
        purchase_place = models.CharField(verbose_name='購入場所', max_length=155, unique=True)
        
    
    class Closet(models.Model):
        user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name='ユーザー', on_delete=models.CASCADE, null=True)
        closet_name = models.CharField(verbose_name='クローゼット名', max_length=255)
        closet_memo = models.CharField(verbose_name='クローゼットメモ', max_length=325)
        create_date = models.DateTimeField(verbose_name='クローゼット作成日', auto_now_add=True)
    
        class Meta:
            ordering =['create_date']
        
        def __str_(self):
            return self.closet_name
    
    
    class Item(models.Model):
        user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name='ユーザー', on_delete=models.CASCADE, null=True)
        item_type = models.ForeignKey(ItemType, verbose_name='アイテム種類', on_delete=models.CASCADE, null=True, blank=True, db_column='item_type')
        item_color = models.ForeignKey(ItemColor, verbose_name='アイテムカラー', on_delete=models.CASCADE, blank=True, null=True, db_column='item_color')
        item_brand = models.ForeignKey(ItemBrand, verbose_name='ブランド名称', on_delete=models.CASCADE, blank=True, null=True, db_column='item_brand')
        purchase_place = models.ForeignKey(PurchasePlace, verbose_name='購入場所', on_delete=models.CASCADE, blank=True, null=True, db_column='purchase_place')
        item_name = models.CharField(verbose_name='アイテム名称', max_length=300)
        purchase_date = models.DateTimeField(verbose_name='購入日', blank=True, null=True)
        pricing = models.IntegerField(verbose_name='購入価格(円)',)
        item_image = models.ImageField(verbose_name='アイテム画像', upload_to='', blank=True, null=True)
        memo = models.TextField(verbose_name='メモ', blank=True, null=True)
        create_date = models.DateTimeField(verbose_name='アイテム登録日', auto_now_add=True)
        update_date = models.DateTimeField(verbose_name='アイテム更新日', auto_now=True)
        closet = models.ForeignKey(Closet, on_delete=models.PROTECT, blank=True, null=True, default=None)
        season = models.CharField(verbose_name = '季節', max_length=10, choices = SEASON_CHOICES, default='spring')
        occasion = models.CharField(verbose_name = 'シーン', max_length=30, choices = OCCASION_CHOICES, default='daily_use')
        favorite_level = models.IntegerField(verbose_name = 'お気に入り度', choices = FAVORITE_LEVEL_CHOICES, blank=True, null=True, default='1')
        item_importance = models.IntegerField(verbose_name = '大事さ', choices = ITEM_IMPORTANCE_CHOICES, blank=True, null=True, default='1')
    
        class Meta:
            ordering = ['item_name']
    
        def __str__(self):
            return self.item_name
    
[/code]

forms.py

[code]

    from django import forms
    from django.conf import settings
    
    from .models import ItemType, ItemColor, ItemBrand, PurchasePlace, Closet, Item, FAVORITE_LEVEL_CHOICES, ITEM_IMPORTANCE_CHOICES, SEASON_CHOICES, OCCASION_CHOICES
    
    MONTHS = {
        1: '1月', 2: '2月', 3: '3月', 4: '4月',
        5: '5月', 6: '6月', 7: '7月', 8: '8月',
        9: '9月', 10: '10月', 11: '11月', 12: '12月'
    }
    
    class ClosetForm(forms.ModelForm):
    
        class Meta:
            model = Closet
            fields = ('closet_name', 'closet_memo')
            labels = {'closet_name':'クローゼット名', 'closet_memo':'クローゼットメモ'}
    
    
    class ItemForm(forms.ModelForm):
        item_type = forms.ModelChoiceField(queryset=ItemType.objects.all(), label='アイテム種類', empty_label='選択してください', widget=forms.TextInput)
        item_color = forms.ModelChoiceField(queryset=ItemColor.objects.all(), label='アイテムカラー', empty_label='選択してください', initial='', widget=forms.TextInput)
        item_brand = forms.ModelChoiceField(queryset=ItemBrand.objects.all(), label='ブランド', empty_label='選択してください', initial='', widget=forms.TextInput)
        purchase_place = forms.ModelChoiceField(queryset=PurchasePlace.objects.all(), label='購入場所', empty_label='選択してください', initial='', widget=forms.TextInput)
    
        class Meta:
            model = Item
    
            fields = ('item_type', 'item_color', 'item_brand', 'purchase_place', 'item_name', 'purchase_date', 'pricing', 'item_image',
            'memo', 'closet', 'season', 'occasion', 'favorite_level', 'item_importance')
    
            labels = {'item_type':'アイテム種類', 'item_color':'アイテムカラー', 'item_brand':'ブランド', 'purchase_place':'購入場所', 'item_name':'アイテム名称', 
            'purchase_date':'購入日', 'pricing':'購入価格(円)', 'item_image':'アイテム画像', 'memo':'メモ', 'closet':'クローゼット', 'season':'季節', 'occasion':'シーン', 
            'favorite_level':'お気に入り度', 'item_importance':'大事さ'}
    
            widget = {
                'season': forms.RadioSelect(choices=SEASON_CHOICES),
                'occasion': forms.RadioSelect(choices=OCCASION_CHOICES),
                'purchase_date': forms.SelectDateWidget(years = [x for x in range(2000,2040)], months = MONTHS),
                'favorite_level': forms.RadioSelect(choices = FAVORITE_LEVEL_CHOICES ),
                'item_importance': forms.RadioSelect(choices = ITEM_IMPORTANCE_CHOICES),
            }
    
[/code]


CC BY-SA 4.0
2021-11-02T13:48:57.097
83397
2021-11-04T02:56:57.457
2021-11-02T13:55:27.143
3060
48922
question
django
Django ModelCohiceFieldのDB中への初期値設定の仕方が分かりません


[Django choices. How to set default
option?](https://stackoverflow.com/questions/12725720/django-choices-how-to-
set-default-option)

これが似たような質問だと思います。  
defaultフィールドを使うとできるようですね。

以下のようなキーワードで検索するとヒットしました。  
「django choice model 初期値」あるいは  
「django choice model default」


CC BY-SA 4.0
2021-11-04T02:56:57.457
83419
2021-11-04T02:56:57.457
48687
83397
answer