DjangoのUpdateViewでDBに保存された情報を更新したいです。
前提・実現したいこと
お世話になります。
メルカリのようなサイトを作っております。
商品編集ページのところで、編集した後に更新ボタンを押してもDBに保存されません。
特に、エラーメッセージは出ておらず、どこが間違っているかわからない状態なのですが、
form.is_valid()の直前で処理が止まってしまっているようです。
views.pyのUpdateView
views.py
def post(self, request, *args, **kwargs):
print('1')
product_edit_form = forms.ProductEditForm(request.POST or None ,request.FILES or None)
print('2')
if product_edit_form.is_valid():
print('3')
product_edit_form.save()
ターミナル
[20/May/2021 17:26:28] "GET /SellText/mypage_product_edit/1 HTTP/1.1" 200 11251
1
2
[20/May/2021 17:26:42] "POST /SellText/mypage_product_edit/1 HTTP/1.1" 200 11197
該当のソースコード
{% load widget_tweaks %}
<form class="row m-5" action="{% url 'SellText:mypage_product_edit' pk=object.pk %}" method="POST" enctype="multipart/form-data" >
<i class="fas fa-gift text-center fa-6x"></i>
<h1 class="h3 mb-3 fw-normal text-center mt-3">商品情報編集ページ</h1>
{% csrf_token %}
<div class="col-12">
<div class="mb-3">
<label for="exampleFormControlInput1" class="form-label">商品名</label>
<input type="text" class="form-control" id="exampleFormControlInput1" value="{{object.product_name}}" name="product_name" placeholder="50文字まで">
</div>
</div>
<div class="mb-3">
<label for="exampleFormControlTextarea1" class="form-label">商品説明</label>
<input type="text" value="{{object.product_description}}" name="product_description" class="form-control" id="exampleFormControlTextarea1" placeholder="商品の説明: 200文字以内" >
</div>
<div class="mb-3">
<label for="exampleFormControlTextarea1" class="form-label">商品の状態</label>
<select value="{{object.product_status}}" name="product_status" class="form-select" aria-label="Default select example">
<option value="新品未使用">新品未使用</option>
<option value="未使用に近い">未使用に近い</option>
<option value="3">目立った傷や汚れは無し</option>
<option value="書き込みや傷がある">書き込みや傷がある</option>
<option value="状態は最悪だが使える">状態は最悪だが使える</option>
</select>
</div>
<div class="input-group mb-3">
<label class="input-group-text" for="inputGroupFile01">商品画像 1枚目</label>
<input value="{{object.product_picture1}}" name="product_picture1" type="file" class="form-control" id="inputGroupFile01">
</div>
<div class="input-group mb-3">
<label class="input-group-text" for="inputGroupFile01">商品画像 2枚目</label>
<input value="{{object.product_picture2}}" name="product_picture2" type="file" class="form-control" id="inputGroupFile01">
</div>
<div class="input-group mb-3">
<label class="input-group-text" for="inputGroupFile01">商品画像 3枚目</label>
<input value="{{object.product_picture3}}" name="product_picture3" type="file" class="form-control" id="inputGroupFile01">
</div>
<div class="mb-3">
<label for="exampleFormControlTextarea1" class="form-label">発送日</label>
<select value="{{object.product_delivery}}" name="product_delivery" class="form-select" aria-label="Default select example">
<option value="1~2日以内">1~2日以内</option>
<option value="3~4日以内">3~4日以内</option>
<option value="5~7日以内">5~7日以内</option>
</select>
</div>
<div class="mb-3">
<label for="exampleFormControlInput1" class="form-label">授業名</label>
<input value="{{object.lecture_name}}" name="lecture_name" type="text" class="form-control" id="exampleFormControlInput1" placeholder="50文字まで">
</div>
<div class="mb-3">
<label for="exampleFormControlTextarea1" class="form-label">学科</label>
<select value="{{object.faculty}}" name="faculty" class="form-select" aria-label="Default select example">
<option value="工学部">工学部</option>
<option value="共同教育学部">共同教育学部</option>
<option value="地域デザイン科学部">地域デザイン科学部</option>
<option value="農学部">農学部</option>
<option value="国際学部">国際学部</option>
<option value="大学院">大学院</option>
<option value="その他(学部共通、全学年共通 etc..)">その他(学部共通、全学年共通 etc..)</option>
</select>
</div>
<div class="mb-3">
<label for="exampleFormControlTextarea1" class="form-label">学部</label>
<select value="{{object.department}}" name="department" class="form-select" aria-label="Default select example">
<option value="地域デザイン:コミュニティ">地域デザイン:コミュニティ</option>
<option value="地域デザイン:建築都市">地域デザイン:建築都市</option>
<option value="地域デザイン:社会基盤">地域デザイン:社会基盤</option>
<option value="国際学科">国際学科</option>
<option value="共同教育: 教育人間科学系">共同教育: 教育人間科学系</option>
<option value="共同教育: 人文社会系">共同教育: 人文社会系</option>
<option value="共同教育: 自然科学系">共同教育: 自然科学系</option>
<option value="共同教育: 芸術・生活・健康系">共同教育: 芸術・生活・健康系</option>
<option value="工学: 物質環境化学コース">工学: 物質環境化学コース</option>
<option value="工学: 機械システム工学コース">工学: 機械システム工学コース</option>
<option value="工学: 情報電子オプティクスコース">工学: 情報電子オプティクスコース</option>
<option value="工学: その他">工学: その他</option>
<option value="農学: 生物資源科学">農学: 生物資源科学</option>
<option value="農学: 応用生命化学">農学: 応用生命化学</option>
<option value="農学: 農業環境工学科">農学: 農業環境工学科</option>
<option value="農学: 農業経済学科">農学: 農業経済学科</option>
<option value="農学: 森林科学科">農学: 森林科学科</option>
<option value="大学院: 地域創生科学研究科">大学院: 地域創生科学研究科</option>
<option value="大学院: 教育学研究科">大学院: 教育学研究科</option>
<option value="大学院: 連合農学研究科">大学院: 連合農学研究科</option>
</select>
</div>
<div class="mb-3">
<label for="exampleFormControlTextarea1" class="form-label">学年</label>
<select value="{{object.grade}}" name="grade" class="form-select" aria-label="Default select example">
<option value="学部1年">学部1年</option>
<option value="学部2年">学部2年</option>
<option value="学部3年">学部3年</option>
<option value="学部4年">学部4年</option>
<option value="大学院1年">大学院1年</option>
<option value="大学院2年">大学院2年</option>
<option value="その他">その他</option>
</select>
</div>
<div class="mb-3">
<label value="{{object.place}}" name="place" for="exampleFormControlTextarea1" class="form-label">受け取り場所</label>
<select class="form-select" aria-label="Default select example">
<option value="峰キャンパス前 ミニストップ">峰キャンパス前 ミニストップ</option>
<option value="陽東キャンパス前 ミニストップ">陽東キャンパス前 ミニストップ</option>
</select>
</div>
<div class="input-group mb-3">
<span class="input-group-text">¥</span>
<span class="input-group-text">0 ~ 9,999,999円</span>
<input value="{{object.price}}" name="price" type="number" class="form-control" placeholder="価格から手数料 5%差引かれます" aria-label="Dollar amount (with dot and two decimal places)">
</div>
{{product_edit_form.user}}
<div class="col-12 mt-5">
<input type="submit" class="btn btn-outline-primary" value="更新する">
</div>
</form>
views.py
views.py
class MypageProductEditView(SuccessMessageMixin,UpdateView):
model = Product
form_class = forms.ProductEditForm
template_name ='user_product_edit.html'
success_message = '更新に成功しました。'
def get_success_url(self):
return reverse_lazy('SellText:my_page')
def get_queryset(self):
qs = super(MypageProductEditView, self).get_queryset()
qs = qs.filter(id = self.kwargs['pk'])
return qs
def post(self, request, *args, **kwargs):
print('1')
product_edit_form = forms.ProductEditForm(request.POST or None ,request.FILES or None)
print('2')
if product_edit_form.is_valid():
print('3')
product_edit_form.save()
return super(MypageProductEditView, self).post(request,*args, **kwargs)
urls.py
urls.py
path('mypage_product_edit/<int:pk>',views.MypageProductEditView.as_view(),name='mypage_product_edit'),
forms.py
forms.py
class ProductEditForm(forms.ModelForm, ):
product_name = forms.CharField(label='商品名' ,widget=forms.TextInput(attrs={'placeholder':'50文字まで'}))
product_description = forms.CharField(label='商品説明',widget=forms.TextInput(attrs={'placeholder':'商品の説明: 200文字以内','rows': 5, 'colos':60}))
product_status = forms.CharField(label='商品の状態')
product_picture1 = forms.FileField(label='画像: 1枚目')
product_picture2 = forms.FileField(label='画像: 2枚目')
product_picture3 = forms.FileField(label='画像: 3枚目')
product_delivery = forms.CharField(label='発送日')
lecture_name = forms.CharField(label='授業名')
faculty = forms.CharField(label='関係する学部')
department =forms.CharField(label='学科')
grade = forms.CharField(label='学年')
price = forms.IntegerField(label='商品価格',widget=forms.TextInput(attrs={'placeholder':'販売価格から5%の手数料が差引かれます'}))
place = forms.CharField(label='受け取り場所')
class Meta:
model = Product
fields=('product_name','product_description','product_status','product_delivery','price','product_picture1','product_picture2','product_picture3','lecture_name','faculty','department','grade','place')
models.py
models.py
class Product(models.Model):
product_name = models.CharField(max_length=50)
product_description = models.CharField(max_length=200)
product_status = models.CharField(max_length=50)
product_delivery = models.CharField(max_length=50)
price = models.IntegerField()
product_picture1 = models.FileField(upload_to='product_picture1/')
product_picture2 = models.FileField(upload_to='product_picture2/')
product_picture3 = models.FileField(upload_to='product_picture3/')
lecture_name = models.CharField(max_length=100)
faculty = models.CharField(max_length=50)
department = models.CharField(max_length=50)
grade = models.CharField(max_length=50)
place = models.CharField(max_length=20)
like = models.IntegerField(default=0)
user = models.ForeignKey(Users, on_delete=models.CASCADE)
exhibit_product.html
{% load widget_tweaks %}
<form class="row m-5" action="{% url 'SellText:exhibit_product' %}" method="POST" enctype="multipart/form-data" >
<i class="fas fa-gift text-center fa-6x"></i>
<h1 class="h3 mb-3 fw-normal text-center mt-3">出品ページ</h1>
{% csrf_token %}
{% if form.errors %}
{% for key, value in form.error.items %}
{% if key != '__all__' %}
<p>{{key}}: {{value.as_text}}</p>
{% endif %}
{%endfor%}
{% endif %}
<div class="col-12">
<div class="mb-3">
<label for="exampleFormControlInput1" class="form-label">商品名</label>
<!-- <input type="email" class="form-control" id="exampleFormControlInput1" placeholder="50文字まで">-->
{{ form.product_name | add_class:"form-control" }}
</div>
</div>
<div class="mb-3">
<label for="exampleFormControlTextarea1" class="form-label">商品説明</label>
<!-- <textarea class="form-control" id="exampleFormControlTextarea1" placeholder="商品の説明: 200文字以内" rows="50"></textarea> -->
{{ form.product_description | add_class:"form-control" }}
</div>
<div class="mb-3">
<label for="exampleFormControlTextarea1" class="form-label">商品の状態</label>
{{ form.product_status | add_class:"form-select"}}
</div>
<div class="input-group mb-3">
<label class="input-group-text" for="inputGroupFile01">商品画像 1枚目</label>
<!-- <input type="file" class="form-control" id="inputGroupFile01"> -->
{{ form.product_picture1 | add_class:"form-control" }}
</div>
<div class="input-group mb-3">
<label class="input-group-text" for="inputGroupFile01">商品画像 2枚目</label>
<!-- <input type="file" class="form-control" id="inputGroupFile01"> -->
{{ form.product_picture2 | add_class:"form-control" }}
</div>
<div class="input-group mb-3">
<label class="input-group-text" for="inputGroupFile01">商品画像 3枚目</label>
<!-- <input type="file" class="form-control" id="inputGroupFile01"> -->
{{ form.product_picture3 | add_class:"form-control" }}
</div>
<div class="mb-3">
<label for="exampleFormControlTextarea1" class="form-label">発送日</label>
{{ form.product_delivery | add_class:"form-select"}}
</div>
<div class="mb-3">
<label for="exampleFormControlInput1" class="form-label">授業名</label>
<!-- <input type="email" class="form-control" id="exampleFormControlInput1" placeholder="50文字まで"> -->
{{ form.lecture_name | add_class:"form-control" }}
</div>
<div class="mb-3">
<label for="exampleFormControlTextarea1" class="form-label">学科</label>
{{ form.faculty | add_class:"form-select"}}
</div>
<div class="mb-3">
<label for="exampleFormControlTextarea1" class="form-label">学部</label>
{{ form.department | add_class:"form-select"}}
</div>
<div class="mb-3">
<label for="exampleFormControlTextarea1" class="form-label">学年</label>
{{ form.grade | add_class:"form-select"}}
</div>
<div class="mb-3">
<label for="exampleFormControlTextarea1" class="form-label">受け取り場所</label>
{{ form.place | add_class:"form-select"}}
</div>
<div class="input-group mb-3">
<span class="input-group-text">¥</span>
<span class="input-group-text">0 ~ 9,999,999円</span>
<!-- <input type="text" class="form-control" placeholder="価格から手数料 5%差引かれます" aria-label="Dollar amount (with dot and two decimal places)"> -->
{{ form.price | add_class:"form-control" }}
</div>
{{form.user}}
<div class="col-12 mt-5">
<input type="submit" class="btn btn-outline-primary" value="出品する">
</div>
</form>
補足情報(FW/ツールのバージョンなど)
Django3, Python3.8
0