質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

1回答

2331閲覧

Django ModelCohiceFieldの初期値のDBへの設定の仕方が分かりません。。。

Shug1984

総合スコア0

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2021/11/02 13:41

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

登録したいのはItemFormにある4つの変数でしょうか?

else:
item = form.save(commit=False)
item.user = request.user
item.save()
return redirect('item_create_complete')

この中で処理をさせたいのだと思いますが以下が原因だと思います。
①ModelChoiceFieldから値を取得していない。
②テーブルのインスタンスを取得していない。

①は以下のようにすればデータが取得できるはずです。同様に4つの項目も行って下さい。
Item= form.cleaned_data['item_type ']

②はItemTypeにセーブする場合、インスタンスを作成してからセーブします。
ItemObject = ItemType(item_type =Item)
ItemObject.save()

投稿2021/11/02 14:47

akane_emo

総合スコア30

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Shug1984

2021/11/03 14:23

ご回答ありがとうございます。問題点が明確になりました。 ただ、お恥ずかしいのですが、Item = form.cleaned_data['item_type]、ItemObject以下のコードをどこに設定すればいいのか。。。form = ItemForm以下で展開する。で合っていますでしょうか?
akane_emo

2021/11/04 02:26 編集

バリデーションが正常だったときにcleaned_dataにデータが入ります。 バリデーション関係なく値を取得する場合はrequest.POSTで取得すればよいですが、form.is_validを 使用しているのでcleaned_dataを使用したほうが良いと思います。 なので記述箇所はif form.is_valid():内になります。 下記のイメージになります。 if form.is_valid(): Item= form.cleaned_data['item_type '] ItemObject = ItemType(item_type =Item) ItemObject.save()
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問