Djangoでユーザーの保有する服の情報を登録・管理をするWEBアプリを開発しています。
データの新規登録機能を開発しており、その中でユーザーに任意の項目を入力してもらい、それをデータベースに登録し、2回目以降の新規アイテム登録時にデータベースから選択肢を呼び出す機能を実装したいと考えています。
model.pyの設定、forms.pyの設定を終えて、動作確認をしているのですが任意の項目のイニシャルがDBに登録出来ず、入力内容がDBに保存されずエラーメッセージ「正しく選択してください。選択したものは候補にありません。」が表示されDBに入力内容が保存できません。。。
ググって似たような開発ネタを探しましたが、ドンピシャはなく行きづまっております。
django
1models.py 2import datetime 3from django.db import models 4from django.conf import settings 5 6ITEM_TYPE_CHOICES = [('jacket','上着'),('shirt','シャツ'),('pants','パンツ'),('underpants','下着(下)'),('undershirt','下着(上)'),('socks','靴下'),('others','その他')] 7ITEM_COLOR_CHOICES = [('red','赤'),('blue','青'),('green','緑'),('yellow','黄'),('purple','紫'),('orange','橙'),('black','黒'),('white','白'),('grey','灰'),('beige','ベージュ'),('navy','ネイビー'),('brown','茶'),('others','その他')] 8SEASON_CHOICES = [('spring','春'),('summer','夏'),('fall','秋'),('winter','冬')] 9OCCASION_CHOICES = [('daily_use','普段着'),('work_wear','仕事'),('active_wear','よそ行き'),('sports_wear','スポーツ'),('other_use','その他')] 10FAVORITE_LEVEL_CHOICES = [(1,'めちゃ低い'),(2,'低い'),(3,'普通'),(4,'高い'),(5,'めちゃ高い')] 11ITEM_IMPORTANCE_CHOICES = [(1,'捨てれる'),(2,'悩む'),(3,'普通'),(4,'まあ大事'),(5,'めっちゃ大事')] 12 13 14class ItemType(models.Model): 15 user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name='ユーザー', on_delete=models.CASCADE, null=True) 16 create_date = models.DateTimeField(verbose_name='作成日', auto_now_add=True) 17 item_type = models.CharField(verbose_name='アイテム種類', max_length=155, unique=True) 18 19 20class ItemColor(models.Model): 21 user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name='ユーザー', on_delete=models.CASCADE, null=True) 22 create_date = models.DateTimeField(verbose_name='作成日', auto_now_add=True) 23 item_color = models.CharField(verbose_name='アイテムカラー', max_length=100, unique=True) 24 25 26class ItemBrand(models.Model): 27 user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name='ユーザー', on_delete=models.CASCADE, null=True) 28 create_date = models.DateTimeField(verbose_name='作成日', auto_now_add=True) 29 item_brand = models.CharField(verbose_name='ブランド', max_length=155, unique=True) 30 31 32class PurchasePlace(models.Model): 33 user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name='ユーザー', on_delete=models.CASCADE, null=True) 34 create_date = models.DateTimeField(verbose_name='作成日', auto_now_add=True) 35 purchase_place = models.CharField(verbose_name='購入場所', max_length=155, unique=True) 36 37 38class Closet(models.Model): 39 user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name='ユーザー', on_delete=models.CASCADE, null=True) 40 closet_name = models.CharField(verbose_name='クローゼット名', max_length=255) 41 closet_memo = models.CharField(verbose_name='クローゼットメモ', max_length=325) 42 create_date = models.DateTimeField(verbose_name='クローゼット作成日', auto_now_add=True) 43 44 class Meta: 45 ordering =['create_date'] 46 47 def __str_(self): 48 return self.closet_name 49 50 51class Item(models.Model): 52 user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name='ユーザー', on_delete=models.CASCADE, null=True) 53 item_type = models.ForeignKey(ItemType, verbose_name='アイテム種類', on_delete=models.CASCADE, null=True, blank=True, db_column='item_type') 54 item_color = models.ForeignKey(ItemColor, verbose_name='アイテムカラー', on_delete=models.CASCADE, blank=True, null=True, db_column='item_color') 55 item_brand = models.ForeignKey(ItemBrand, verbose_name='ブランド名称', on_delete=models.CASCADE, blank=True, null=True, db_column='item_brand') 56 purchase_place = models.ForeignKey(PurchasePlace, verbose_name='購入場所', on_delete=models.CASCADE, blank=True, null=True, db_column='purchase_place') 57 item_name = models.CharField(verbose_name='アイテム名称', max_length=300) 58 purchase_date = models.DateTimeField(verbose_name='購入日', blank=True, null=True) 59 pricing = models.IntegerField(verbose_name='購入価格(円)',) 60 item_image = models.ImageField(verbose_name='アイテム画像', upload_to='', blank=True, null=True) 61 memo = models.TextField(verbose_name='メモ', blank=True, null=True) 62 create_date = models.DateTimeField(verbose_name='アイテム登録日', auto_now_add=True) 63 update_date = models.DateTimeField(verbose_name='アイテム更新日', auto_now=True) 64 closet = models.ForeignKey(Closet, on_delete=models.PROTECT, blank=True, null=True, default=None) 65 season = models.CharField(verbose_name = '季節', max_length=10, choices = SEASON_CHOICES, default='spring') 66 occasion = models.CharField(verbose_name = 'シーン', max_length=30, choices = OCCASION_CHOICES, default='daily_use') 67 favorite_level = models.IntegerField(verbose_name = 'お気に入り度', choices = FAVORITE_LEVEL_CHOICES, blank=True, null=True, default='1') 68 item_importance = models.IntegerField(verbose_name = '大事さ', choices = ITEM_IMPORTANCE_CHOICES, blank=True, null=True, default='1') 69 70 class Meta: 71 ordering = ['item_name'] 72 73 def __str__(self): 74 return self.item_name
django
1forms.py 2from django import forms 3from django.conf import settings 4 5from .models import ItemType, ItemColor, ItemBrand, PurchasePlace, Closet, Item, FAVORITE_LEVEL_CHOICES, ITEM_IMPORTANCE_CHOICES, SEASON_CHOICES, OCCASION_CHOICES 6 7MONTHS = { 8 1: '1月', 2: '2月', 3: '3月', 4: '4月', 9 5: '5月', 6: '6月', 7: '7月', 8: '8月', 10 9: '9月', 10: '10月', 11: '11月', 12: '12月' 11} 12 13class ClosetForm(forms.ModelForm): 14 15 class Meta: 16 model = Closet 17 fields = ('closet_name', 'closet_memo') 18 labels = {'closet_name':'クローゼット名', 'closet_memo':'クローゼットメモ'} 19 20 21class ItemForm(forms.ModelForm): 22 item_type = forms.ModelChoiceField(queryset=ItemType.objects.all(), label='アイテム種類', empty_label='選択してください', widget=forms.TextInput) 23 item_color = forms.ModelChoiceField(queryset=ItemColor.objects.all(), label='アイテムカラー', empty_label='選択してください', initial='', widget=forms.TextInput) 24 item_brand = forms.ModelChoiceField(queryset=ItemBrand.objects.all(), label='ブランド', empty_label='選択してください', initial='', widget=forms.TextInput) 25 purchase_place = forms.ModelChoiceField(queryset=PurchasePlace.objects.all(), label='購入場所', empty_label='選択してください', initial='', widget=forms.TextInput) 26 27 class Meta: 28 model = Item 29 30 fields = ('item_type', 'item_color', 'item_brand', 'purchase_place', 'item_name', 'purchase_date', 'pricing', 'item_image', 31 'memo', 'closet', 'season', 'occasion', 'favorite_level', 'item_importance') 32 33 labels = {'item_type':'アイテム種類', 'item_color':'アイテムカラー', 'item_brand':'ブランド', 'purchase_place':'購入場所', 'item_name':'アイテム名称', 34 'purchase_date':'購入日', 'pricing':'購入価格(円)', 'item_image':'アイテム画像', 'memo':'メモ', 'closet':'クローゼット', 'season':'季節', 'occasion':'シーン', 35 'favorite_level':'お気に入り度', 'item_importance':'大事さ'} 36 37 widget = { 38 'season': forms.RadioSelect(choices=SEASON_CHOICES), 39 'occasion': forms.RadioSelect(choices=OCCASION_CHOICES), 40 'purchase_date': forms.SelectDateWidget(years = [x for x in range(2000,2040)], months = MONTHS), 41 'favorite_level': forms.RadioSelect(choices = FAVORITE_LEVEL_CHOICES ), 42 'item_importance': forms.RadioSelect(choices = ITEM_IMPORTANCE_CHOICES), 43 } 44
django
1 2views.py 3 4import datetime 5from django.shortcuts import render, redirect 6from django.contrib.auth.decorators import login_required 7 8 9from .forms import ClosetForm, ItemForm 10 11 12@login_required 13def itemcreateview(request): 14 if request.method == 'POST': 15 form = ItemForm(request.POST, request.FILES) 16 if form.is_valid(): 17 action = request.POST['action'] 18 if action == 'input': 19 return render(request, 'contents/item_registration/item_create.html', {'form':form}) 20 elif action == 'confirm': 21 return render(request,'contents/item_registration/item_creata_confirm.html',{'form':form,}) 22 else: 23 item = form.save(commit=False) 24 item.user = request.user 25 item.save() 26 return redirect('item_create_complete') 27 else: 28 form = ItemForm() 29 return render(request,'contents/item_registration/item_create.html', {'form':form}) 30 31 32@login_required 33def itemcreatecompleteview(request): 34 return render(request, 'contents/item_registration/item_complete.html') 35
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/03 14:23
2021/11/04 02:26 編集