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

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

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

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

Python

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

Q&A

解決済

1回答

7222閲覧

Django1.8.3 form.is_valid() がFalseになってデータを編集できない

退会済みユーザー

退会済みユーザー

総合スコア0

Django

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

Python

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

0グッド

0クリップ

投稿2015/09/06 06:15

編集2015/09/06 06:41

Pythonのバージョンは2.7.9です。

Djangoで、人物とその作品集の情報サイトを作っています。
Djangoのデータベース(sqlite3)にデータを投入しました。
Django付属のAdminページから、そのデータを編集することができるようになりました。

しかし、Adminページではなくて、作っている情報サイトからデータベースの情報を編集したいのです。ところが、編集画面(edit.html)からフォームを送信するとviews.pyのform.is_valid()がFalseになり、編集できません。

edit.htmlにValidationエラーを吐くコードを挿入してフォームを送信したところ、
フィールド上部に次のようなエラーがでました。
・この Id を持った Actress master が既に存在します。
・この Dmmid を持った Actress master が既に存在します。
これはおそらく、Idはmodels.pyでprimary_key=True、Dmmidはunique=Trueとなっているからだと思われます。
models.pyを変更することなく、form.is_valid()がTrueになり、編集できるようにしたいです。

お忙しい中申し訳ありませんが、助言をいただけると嬉しいです。

models.py

Python

1from __future__ import unicode_literals 2 3from django.db import models 4 5 6class ActressMaster(models.Model): 7 id = models.IntegerField(primary_key=True) 8 idolname = models.CharField(db_column='idolName', max_length=255, blank=True, null=True) # Field name made lowercase. 9 kana = models.CharField(max_length=255, blank=True, null=True) 10 roman = models.CharField(max_length=255, blank=True, null=True) 11 height = models.IntegerField(blank=True, null=True) 12 bust = models.CharField(max_length=255, blank=True, null=True) 13 waist = models.IntegerField(blank=True, null=True) 14 hip = models.IntegerField(blank=True, null=True) 15 cup = models.CharField(max_length=5, blank=True, null=True) 16 birthday = models.CharField(max_length=255, blank=True, null=True) 17 dmmid = models.IntegerField(db_column='dmmId', unique=True) # Field name made lowercase. 18 19 class Meta: 20 db_table = 'actress_master' 21 22 def __unicode__(self): 23 return self.idolname

views.py

Python

1from django.shortcuts import * 2from .models import ActressMaster 3from .forms import ActressMasterForm 4from django.contrib.auth.decorators import login_required 5 6# Create your views here. 7 8def detail(request, id): 9 actresss = ActressMaster.objects.get(id=id) 10 print "Detail: %s" %actresss.idolname 11 return render_to_response('portfolio/detail.html', locals(), context_instance=RequestContext(request)) 12 13@login_required 14def edit(request, id): 15 actressss = ActressMaster.objects.get(id=id) 16 print "Edit: %s" %actressss.idolname 17 18 if request.method == "POST": 19 new_actressss_form = ActressMasterForm(request.POST or None) 20 print "new_actressss_form post" 21 # check entry data. It is valid or not 22 if new_actressss_form.is_valid(): 23 print "valid" 24 newest_actressss_form = new_actressss_form.save(commit=False) 25 newest_actressss_form.save() 26 return HttpResponseRedirect('/portfolio/detail/%s/' %actressss.id) 27 else: 28 print new_actressss_form.is_valid() 29 print "not valid" 30 else: 31 new_actressss_form = ActressMasterForm() 32 return render_to_response('portfolio/edit.html', locals(), context_instance=RequestContext(request))

edit.html

HTML

1{% extends "base.html" %} 2 3{% block main %} 4 <h4>{{ actressss }}の情報を編集</h4> 5 <img class="img-responsive" src="{% url 'top' %}static/portfolio/img/small/{{ actressss.picname }}" alt="" style="margin-bottom: 20px;"> 6 7<form role="form" method="post" action="."> 8 {% csrf_token %} 9 {{ new_actressss_form.non_field_errors }} 10 <div class="form-group"> 11 {{ new_actressss_form.id.errors }} 12 <label class="sr-only" for="id_id">ID</label> 13 <input id="id_id" name="id" type="number" class="form-control" value="{{ actressss.id }}"> 14 </div><!-- form group --> 15 16 <div class="form-group"> 17 {{ new_actressss_form.idolname.errors }} 18 <label class="sr-only" for="id_idolname">Idolname</label> 19 <input id="id_idolname" maxlength="255" name="idolname" type="text" class="form-control" value="{{ actressss.idolname }}"> 20 </div><!-- form group --> 21 22 <div class="form-group"> 23 {{ new_actressss_form.kana.errors }} 24 <label class="sr-only" for="id_kana">Kana</label> 25 <input id="id_kana" maxlength="255" name="kana" type="text" class="form-control" value="{{ actressss.kana }}"> 26 </div><!-- form group --> 27 28 <div class="form-group"> 29 {{ new_actressss_form.roman.errors }} 30 <label class="sr-only" for="id_roman">Roman</label> 31 <input id="id_roman" maxlength="255" name="roman" type="text" class="form-control" value="{{ actressss.roman }}"> 32 </div><!-- form group --> 33 34 <div class="form-group"> 35 {{ new_actressss_form.height.errors }} 36 <label class="sr-only" for="id_height">Height</label> 37 <input id="id_height" name="height" type="number" class="form-control" value="{{ actressss.height }}"> 38 </div><!-- form group --> 39 40 <div class="form-group"> 41 {{ new_actressss_form.bust.errors }} 42 <label class="sr-only" for="id_bust">Bust</label> 43 <input id="id_bust" maxlength="255" name="bust" type="text" class="form-control" value="{{ actressss.bust }}"> 44 </div><!-- form group --> 45 46 <div class="form-group"> 47 {{ new_actressss_form.waist.errors }} 48 <label class="sr-only" for="id_waist">Waist</label> 49 <input id="id_waist" name="waist" type="number" class="form-control" value="{{ actressss.waist }}"> 50 </div><!-- form group --> 51 52 <div class="form-group"> 53 {{ new_actressss_form.hip.errors }} 54 <label class="sr-only" for="id_hip">Hip</label> 55 <input id="id_hip" name="hip" type="number" class="form-control" value="{{ actressss.hip }}"> 56 </div><!-- form group --> 57 58 <div class="form-group"> 59 {{ new_actressss_form.cup.errors }} 60 <label class="sr-only" for="id_cup">Cup</label> 61 <input id="id_cup" maxlength="5" name="cup" type="text" class="form-control" value="{{ actressss.cup }}"> 62 </div><!-- form group --> 63 64 <div class="form-group"> 65 {{ new_actressss_form.birthday.errors }} 66 <label class="sr-only" for="id_birthday">Birthday</label> 67 <input id="id_birthday" maxlength="255" name="birthday" type="text" class="form-control" value="{{ actressss.birthday }}"> 68 </div><!-- form group --> 69 70 <div class="form-group"> 71 {{ new_actressss_form.dmmid.errors }} 72 <label class="sr-only" for="id_dmmid">Dmmid</label> 73 <input id="id_dmmid" name="dmmid" type="number" class="form-control" value="{{ actressss.dmmid }}"> 74 </div><!-- form group --> 75 76 <div class="form-group"> 77 <button type="submit" class="btn btn-primary"><i class="fa fa-floppy-o"></i> Save</button> 78 </div><!-- form group --> 79</form> 80 81{% endblock main %}

forms.py

Python

1from django import forms 2from .models import ActressMaster 3 4class ActressMasterForm(forms.ModelForm): 5 class Meta: 6 model = ActressMaster 7 fields = '__all__'

StackOverflowなども見ましたが、解決出来ませんでした。

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

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

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

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

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

guest

回答1

0

ベストアンサー

試してはいないので申し訳ないですが、ActressMasterFormでインスタンスを生成する際、instanceキーワードでActressMasterのインスタンスを指定すればできるかもしれません。

Python

1@login_required 2def edit(request, id): 3 actressss = ActressMaster.objects.get(id=id) 4 print "Edit: %s" %actressss.idolname 5 6 if request.method == "POST": 7 # instanceキーワードを指定する 8 new_actressss_form = ActressMasterForm(request.POST or None, instance=actressss) 9 print "new_actressss_form post" 10 # 以下略

参考:
python - Django edit form based on add form? - Stack Overflow

投稿2015/09/06 07:28

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2015/09/06 09:01

ekaterinaさま、 コメントありがとうございます。 挙げていただいたStackOverflowのポストを私も以前見ていて、その時試したところ、出来ませんでした。 しかし、先ほどもう一度やったらうまくいきました(^^) いろいろ試行錯誤しながらコードを書き換えていたので環境が変わり、今度はうまくいったのだと思います。 また、Djangoの公式ドキュメントに以下のような記載がありました。見逃していました。 https://docs.djangoproject.com/en/1.8/topics/forms/modelforms/#the-save-method " A subclass of ModelForm can accept an existing model instance as the keyword argument instance; if this is supplied, save() will update that instance. If it’s not supplied, save() will create a new instance of the specified model:" インスタンスキーワードを指定すると、updateになり、指定しないと、createになるんですね。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問