hiramatsu0415
@hiramatsu0415

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

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

No Answers yet.

Your answer might help someone💌