いつも大変お世話になっております。
表記の件につきまして、現在下記のような二つのモデルが存在しており、「shopping_list_form.html」のフォームからPOSTした際に自動的に「Purchase_history」モデルに反映されるようにしたいのですが、やり方が分からず困っております。
python
1#models.py 2 3class Shopping_list(models.Model): 4 name = models.CharField(max_length=64) 5 price = models.IntegerField(null=True, blank=True) 6 7 def __str__(self): 8 return '%s' % (self.name) 9 10 11class Purchase_history(models.Model): 12 name = models.CharField(max_length=64) 13 price = models.IntegerField(null=True, blank=True) 14 15 def __str__(self): 16 return '%s' % (self.name)
html
1<body> 2 3 {% if error_list %} 4 <ul> 5 {% for v in error_list %} 6 <li>{{ v }}</li> 7 {% endfor %} 8 </ul> 9 {% endif %} 10 11 <h3>買い物リストを編集する</h3> 12 13 <form method="post"> 14 <!--ミドルウェアに「django.middleware.csrf.CsrfViewMiddleware」を指定しているとcsrf_tokenを渡していないPOSTメソッドは403エラーになる--> 15 {{ form.management_form }} 16 {% csrf_token %} 17 <div class="shopping_list"> 18 {% for fm in form %} 19 {{ fm.id }} 20 <div class="shopping_list_one"> 21 <p>商品名<br/>{{ fm.name }}</p> 22 <br/> 23 <p>金額<br/>{{ fm.price }}</p> 24 <p class="delete_check_box">削除:{{ fm.DELETE }}</p> 25 </div> 26 {% endfor %} 27 <button type="submit">リストを更新</button> 28 </form> 29 30 <a href="{% url "stockpile:index" %}">トップに戻る</a> 31 32 <h4 id="week_menu_list">今週のメニュー</h4> 33 <table> 34 <tr> 35 <th>月</th> 36 <th>火</th> 37 <th>水</th> 38 <th>木</th> 39 <th>金</th> 40 <th>土</th> 41 <th>日</th> 42 </tr> 43 {% for v in Week_menu %} 44 <tr> 45 <td>{{ v.mon }}</td> 46 <td>{{ v.tue }}</td> 47 <td>{{ v.wed }}</td> 48 <td>{{ v.thu }}</td> 49 <td>{{ v.fri }}</td> 50 <td>{{ v.sat }}</td> 51 <td>{{ v.sun }}</td> 52 </tr> 53 {% endfor %} 54 55</body>
「Shopping_list」のフォームに関しては、汎用ビューとmodelformset_factoryを利用してフォームを3つ発生させるようにしております。
「Purchase_historyForm」のビューに関してはどうすればいいか分からず、まだ記述しておりません。
python
1#forms.py 2 3class Shopping_listForm(ModelForm): 4 5 class Meta: 6 model = Shopping_list 7 fields = ("name", "price") 8 9 10Shopping_listFormSet = modelformset_factory( 11 Shopping_list, 12 form=Shopping_listForm, 13 fields=("name", "price"), 14 extra=3, 15 can_delete=True 16 ) 17 18 19class Purchase_historyForm(ModelForm): 20 21 class Meta: 22 model = Purchase_history 23 fields = ("name", "price")
python
1# Views.py 2 3class Shopping_listCreateView(FormView): 4 # model = Shopping_list 5 # fields = ["name", "price"] 6 form_class = Shopping_listFormSet 7 template_name = "stockpile/shopping_list_form.html" 8 success_url = "/stockpile/shopping_list/" 9 10 def get_context_data(self, **kwargs): 11 context = super().get_context_data(**kwargs) 12 context['Week_menu'] = Week_menu.objects.all() 13 return context 14 15 def form_valid(self, form): 16 form.save() # ここで保存 17 return super().form_valid(form) # リダイレクト処理です。redirect関数等でも良いです。 18
考えていたのは
・Shopping_listCreateViewでShopping_listモデルに保存
・Purchase_historyに保存するためアップデートビューに飛ばす(テンプレートは表示させない)
・アップデートビューから変遷先のテンプレートにリダイレクト
で、実装できるのかな。と考えておりましたが、そもそもそのやりかたも分からず、ご教授頂きたいです。
追記:修正しましたが解決に至っておりません。コードは下記の通りです。
python
1# views.py 2 3# Shopping_listView 4 5class Shopping_listView(ListView): 6 model = Shopping_list 7 paginate_by = 30 8 template_name = "stockpile/shopping_list.html" 9 queryset = Shopping_list.objects.all() 10 11 def get_context_data(self, **kwargs): 12 context = super().get_context_data(**kwargs) 13 ''' 14 辞書のリストが帰ってくる 15 [{"id": 1, "price":500......}] 16 ''' 17 all_list_price = Shopping_list.objects.all().values("id", "price") 18 sum_price = 0 19 for v in all_list_price: 20 price = v["price"] 21 sum_price += price 22 context['sum_price'] = sum_price 23 return context 24 25 26class Shopping_listCreateView(FormView): 27 # model = Shopping_list 28 # fields = ["name", "price"] 29 form_class = Shopping_listFormSet 30 template_name = "stockpile/shopping_list_form.html" 31 success_url = "/stockpile/shopping_list/" 32 33 def get_context_data(self, **kwargs): 34 context = super().get_context_data(**kwargs) 35 context['Week_menu'] = Week_menu.objects.all() 36 return context 37 38 def form_valid(self, form): 39 form.save() # ここで保存 40 41 for f in form: 42 Purchase_history.objects.create(name=f.cleaned_data["name"], 43 price=f.cleaned_data["price"]) 44 45 return super().form_valid(form) 46 47 48def delete_shopping_list(request, shopping_list_id): 49 shopping_list = get_object_or_404(Shopping_list, id=shopping_list_id) 50 shopping_list.delete() 51 shopping_list = Shopping_list.objects.all() 52 context = {'object_list': shopping_list} 53 return render(request, 'stockpile/shopping_list.html', context)
python
1forms.py 2 3class Shopping_listForm(ModelForm): 4 5 class Meta: 6 model = Shopping_list 7 fields = ("name", "price") 8 9 10Shopping_listFormSet = modelformset_factory( 11 Shopping_list, 12 form=Shopping_listForm, 13 fields=("name", "price"), 14 extra=3, 15 can_delete=True 16 ) 17 18class Purchase_historyForm(ModelForm): 19 20 class Meta: 21 model = Purchase_history 22 fields = ("name", "price")
Local
1__class__ 2<class 'stockpile.views.Shopping_listCreateView'> 3 4f 5<Shopping_listForm bound=True, valid=True, fields=(name;price;id;DELETE)> 6 7form 8<django.forms.formsets.Shopping_listFormFormSet object at 0x7f1e95ec36a0> 9 10self 11<stockpile.views.Shopping_listCreateView object at 0x7f1e95df7518>
fオブジェクトにはnameが存在しているように見えるのですが、エラーとなります
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/17 21:01
2018/07/17 21:10
2018/07/18 00:49
2018/07/18 20:58
2018/07/18 22:15
2018/07/18 23:50
2018/07/26 23:59