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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2564閲覧

【Django】既存のモデルデータを別のモデルに入れる方法

setuna0531

総合スコア128

Django

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/09/02 06:45

編集2020/09/02 06:53

#実現したいこと
「ショップ、カテゴリ、商品」と3つのモデルを作成しています。
カテゴリを作成し、その情報を引き継いだ状態で商品を作成したいのですが、
方法がわからなかったため投稿させていただきます。

商品を作成する際に、選択したカテゴリが自動で選択されていることを実装したいです。

#試したこと
classベースで作成しているため下記のソースで対応できるかと考えましたが、
試行錯誤を繰り返してもダメでした。

views

1class Item_Create(generic.CreateView): 2 form_class = ItemForm 3 template_name = 'item_create.html' 4 success_url = reverse_lazy('item_list') 5 6 def form_valid(self, form): 7 qryset = form.save(commit=False) 8 qryset.user=self.request.user #ログインユーザーを自動で取込 9 qryset.category=self.request.category #カテゴリを呼び出せるかと思ったが無理だった 10 qryset.save() 11 return super(Item_Create, selft).form_valid(form)

#ソース

model

1class Shop(models.Model): 2 user = models.ForeignKey( 3 settings.AUTH_USER_MODEL, verbose_name='ログインユーザー', on_delete=models.CASCADE 4 ) 5 shop = models.CharField (max_length=100, verbose_name='店舗名') 6 updated_at = models.DateTimeField(auto_now= True) 7 created_at = models.DateTimeField(auto_now_add= True) 8 9 def __str__(self): 10 return f'{self.shop}' 11 12 13class Category(models.Model): 14 user = models.ForeignKey(get_user_model(), verbose_name='ログインユーザー', on_delete=models.CASCADE) 15 shopname = models.ForeignKey(Shop, verbose_name='店舗名', on_delete=models.CASCADE) 16 order = models.IntegerField(blank=False) #カテゴリ番号 17 categoryname = models.CharField(max_length=26, blank=False) 18 createtime = models.DateTimeField('作成日', auto_now_add= True) 19 updatetime = models.DateTimeField('更新日', auto_now= True) 20 21 def __str__(self): 22 return f'{self.categoryname}' 23 24class Item(models.Model): 25 user = models.ForeignKey(get_user_model(), verbose_name='ログインユーザー', on_delete=models.CASCADE) 26 shopname = models.ForeignKey(Shop, verbose_name='店舗名', on_delete=models.CASCADE) 27 category = models.ForeignKey(Category, verbose_name='カテゴリー', on_delete=models.CASCADE) 28 order = models.IntegerField(blank=False) #アイテム番号 29 itemname = models.CharField(max_length=26, blank=False) 30 price = models.IntegerField(blank=False) 31 createtime = models.DateTimeField('作成日', auto_now_add= True) 32 updatetime = models.DateTimeField('更新日', auto_now= True) 33 def __str__(self): 34 return f'{self.category} {self.itemname}'

#最後に
def form_validについても調べましたが、有力が情報が得られませんでした。
わかる方いらっしゃいましたら教えていただきたいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

get_initialメソッドで初期値を設定できます。

python

1class Item_Create(CreateView): 2 def get_initial(self, *args, **kwargs): 3 initial = super().get_initial(**kwargs) 4 initial['category'] = category # 初期値としたいCategoryモデルインスタンスを設定 5 return initial

投稿2020/09/02 07:33

hasami

総合スコア1277

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

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

setuna0531

2020/09/02 08:03

ご回答ありがとうございます。 自分の知識不足であまり理解できていない状況なのですが、 Form.pyにてcategoryに対して値を入れる処理をすればよいのでしょうか? もしくは def get_initaial(self, *args, **kwargs)を 現在のviewsに追加すればよいのでしょか。 質問なのですが、form_validにてモデルデータ作成時に 既存データを指定して、商品を作成ということがやりたいのですが、 ご回答いただいた内容でも同様のことは出来るのでしょうか。
hasami

2020/09/02 22:34 編集

CreateViewから派生したクラスに、get_initialメソッドを実装します。 回答の`initial['category'] = category`の右辺である`category`が、おっしゃる「既存データ」だと考えておりますが、ちがうのでしょうか。
hasami

2020/09/03 00:04

> 質問なのですが、form_validにてモデルデータ作成時に すみません。上記の部分を見落としていました。 CreateViewから派生したクラスのfieldsからcategoryを削除して、以下のようにすればできると思いいます。 fieldsからcategoryを削除すれば、フォームでcategoryの検証はされません。 def form_valid(self, form): self.object = form.save(commit=False) category = Category.objects.get(...) # 設定したいCategoryモデルインスタンスを取得 self.object.category = category self.object.save() return super().form_valid(form)
setuna0531

2020/09/03 04:53

hasami様 ご回答いただいたお通りに設定したところうまくいきました! また何かありましたら手助けをお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問