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

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

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

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

Q&A

解決済

1回答

613閲覧

【Django】ModelとFormの項目が1対1でない場合の対応

tokyo

総合スコア35

Django

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

0グッド

0クリップ

投稿2019/04/04 01:46

modelとformの項目が同じ場合、views.pyでCreateViewを継承して使うとsuper().form_valid(form)だけでsaveまでしてくれるようですが、画面入力された値を編集してmodelにセットして登録する場合はどのように書けばよろしいでしょうか?
やりたいことはformのdate_y, m, d, h, mを使って年月日時分をそれぞれのテキストボックスで画面入力し、登録時には1つにしてmodelのdatetimeに登録したいです。
よろしくお願いします。

models.py

Python

1class Hoge(models.Model): 2 name = models.CharField('名称') 3 memo = models.CharField('メモ', max_length=2048) 4 datetime = models.DateTimeField('日時')

forms.py

Python

1class HogeForm(forms.ModelForm): 2 name = forms.CharField(required=True, label='名称') 3 memo = forms.CharField(required=False, label='メモ', max_length=2048, widget=forms.Textarea()) 4 date_y = forms.CharField(required=True, label='年') 5 date_m = forms.CharField(required=True, label='月') 6 date_d = forms.CharField(required=True, label='日') 7 date_h = forms.CharField(required=True, label='時') 8 date_m = forms.CharField(required=True, label='分')

views.py

Python

1class HogeCreateView(django.views.generic.CreateView): 2 model = Hoge 3 form_class = HogeForm 4 success_url = reverse_lazy('hoge:hoge') 5 template_name = 'hoge/hoge.html' 6 7 def form_valid(self, form): 8 result = super().form_valid(form) 9 messages.success( 10 self.request, 'ほげを追加しました'.format(form.instance)) 11 return result

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

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

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

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

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

guest

回答1

0

ベストアンサー

質問の意図が明確に読み取れないのですが、
入力された値を取り出すなら、

viewの中にrequest.POST["key"]みたいなことでも取り出せます。

その他の方法として
form.is_valid()をかませた後にform.cleaned_data["key"]でディクショナリっぽい感じで値を取り出すこともできます。
値を取り出した後に自分の好きなように値を加工するのでは困るのでしょうか?

投稿2019/04/05 09:13

chapin

総合スコア80

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

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

tokyo

2019/04/06 08:34

ご回答ありがとうございます。 ①form._isvalid()でmodelとformが一致している項目のみ一旦保存 ②それ以外の項目をform.cleaned_data[""]やrequest.POST[""]などで取得し加工して保存 この流れでいけるということですね。 formを使ったネットのサンプルがmodelの項目と完全一致しているサンプルしか見つけることができず、私のようなformとmodelを利用する場合はどのように保存したら良いかわからず質問していました。 ご回答いただきました2段階で保存するやり方でやってみます。 ありがとうございました!
chapin

2019/04/06 09:32

もう少し補足しますと、 form.is_valid()を使い、form.cleaned_data["key"] を使って値を取り出すのはtemplaeに{{ form }} を使った場合です(forms.Formやforms.ModelFormを使った場合)。templateにinputタグのようなものを使い直接フォームを書いた場合request.POST["key"]しか使えなかったもしれません。 またkeyに関しては{{ form }}のようにforms.Formやforms.ModelFormを使う場合は基本的にクラスで設定した属性(アトリビュート)が自動的にkeyになります。 またinputタグにname属性を忘れず記入してください。nameがkeyになります。このkeyを介して値を取り出します。
chapin

2019/04/06 09:38

class HogeForm(forms.Form): name = forms.CharField(required=True, label='名称') memo = forms.CharField(required=False, label='メモ', max_length=2048, widget=forms.Textarea()) date_y = forms.IntegerField(required=True, label='年') date_m = forms.IntegerField(required=True, label='月') date_d = forms.IntegerField(required=True, label='日') date_h = forms.IntegerField(required=True, label='時') date_m = forms.IntegerField(required=True, label='分') forms.Formを継承し、forms.IntegerFieldにするとなお良いと思います。 この場合labelを使っているのでkeyはlabelで入力したものになります。 ModelFormの継承の仕方ではうまくいかないと思います。 https://docs.djangoproject.com/ja/2.1/topics/forms/modelforms/
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問