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

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

ただいまの
回答率

90.47%

  • Python

    8607questions

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

  • Django

    1118questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,895

Delpy

score 27

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
from __future__ import unicode_literals

from django.db import models


class ActressMaster(models.Model):
    id = models.IntegerField(primary_key=True)
    idolname = models.CharField(db_column='idolName', max_length=255, blank=True, null=True)  # Field name made lowercase.
    kana = models.CharField(max_length=255, blank=True, null=True)
    roman = models.CharField(max_length=255, blank=True, null=True)
    height = models.IntegerField(blank=True, null=True)
    bust = models.CharField(max_length=255, blank=True, null=True)
    waist = models.IntegerField(blank=True, null=True)
    hip = models.IntegerField(blank=True, null=True)
    cup = models.CharField(max_length=5, blank=True, null=True)
    birthday = models.CharField(max_length=255, blank=True, null=True)
    dmmid = models.IntegerField(db_column='dmmId', unique=True)  # Field name made lowercase.

    class Meta:
        db_table = 'actress_master'

    def __unicode__(self):
        return self.idolname
views.py
from django.shortcuts import *
from .models import ActressMaster
from .forms import ActressMasterForm
from django.contrib.auth.decorators import login_required

# Create your views here.

def detail(request, id):
    actresss = ActressMaster.objects.get(id=id)
    print "Detail: %s" %actresss.idolname
    return render_to_response('portfolio/detail.html', locals(), context_instance=RequestContext(request))

@login_required
def edit(request, id):
    actressss = ActressMaster.objects.get(id=id)
    print "Edit: %s" %actressss.idolname
    
    if request.method == "POST":
        new_actressss_form = ActressMasterForm(request.POST or None)
        print "new_actressss_form post"
        # check entry data. It is valid or not
        if new_actressss_form.is_valid():
            print "valid"
            newest_actressss_form = new_actressss_form.save(commit=False)
            newest_actressss_form.save()
            return HttpResponseRedirect('/portfolio/detail/%s/' %actressss.id)
        else:
            print new_actressss_form.is_valid()
            print "not valid"
    else:
        new_actressss_form = ActressMasterForm()
    return render_to_response('portfolio/edit.html', locals(), context_instance=RequestContext(request))

edit.html
{% extends "base.html" %}

{% block main %}
    <h4>{{ actressss }}の情報を編集</h4>
        <img class="img-responsive" src="{% url 'top' %}static/portfolio/img/small/{{ actressss.picname }}" alt="" style="margin-bottom: 20px;">

<form role="form" method="post" action=".">
    {% csrf_token %}
    {{ new_actressss_form.non_field_errors }}
    <div class="form-group">
        {{ new_actressss_form.id.errors }}
        <label class="sr-only" for="id_id">ID</label>
        <input id="id_id" name="id" type="number" class="form-control" value="{{ actressss.id }}">
    </div><!-- form group -->

    <div class="form-group">
        {{ new_actressss_form.idolname.errors }}
        <label class="sr-only" for="id_idolname">Idolname</label>
        <input id="id_idolname" maxlength="255" name="idolname" type="text" class="form-control" value="{{ actressss.idolname }}">
    </div><!-- form group -->

    <div class="form-group">
        {{ new_actressss_form.kana.errors }}
        <label class="sr-only" for="id_kana">Kana</label>
        <input id="id_kana" maxlength="255" name="kana" type="text" class="form-control" value="{{ actressss.kana }}">
    </div><!-- form group -->

    <div class="form-group">
        {{ new_actressss_form.roman.errors }}
        <label class="sr-only" for="id_roman">Roman</label>
        <input id="id_roman" maxlength="255" name="roman" type="text" class="form-control" value="{{ actressss.roman }}">
    </div><!-- form group -->

    <div class="form-group">
        {{ new_actressss_form.height.errors }}
        <label class="sr-only" for="id_height">Height</label>
        <input id="id_height" name="height" type="number" class="form-control" value="{{ actressss.height }}">
    </div><!-- form group -->

    <div class="form-group">
        {{ new_actressss_form.bust.errors }}
        <label class="sr-only" for="id_bust">Bust</label>
        <input id="id_bust" maxlength="255" name="bust" type="text" class="form-control" value="{{ actressss.bust }}">
    </div><!-- form group -->

    <div class="form-group">
        {{ new_actressss_form.waist.errors }}
        <label class="sr-only" for="id_waist">Waist</label>
        <input id="id_waist" name="waist" type="number" class="form-control" value="{{ actressss.waist }}">
    </div><!-- form group -->

    <div class="form-group">
        {{ new_actressss_form.hip.errors }}
        <label class="sr-only" for="id_hip">Hip</label>
        <input id="id_hip" name="hip" type="number" class="form-control" value="{{ actressss.hip }}">
    </div><!-- form group -->

    <div class="form-group">
        {{ new_actressss_form.cup.errors }}
        <label class="sr-only" for="id_cup">Cup</label>
        <input id="id_cup" maxlength="5" name="cup" type="text" class="form-control" value="{{ actressss.cup }}">
    </div><!-- form group -->

    <div class="form-group">
        {{ new_actressss_form.birthday.errors }}
        <label class="sr-only" for="id_birthday">Birthday</label>
        <input id="id_birthday" maxlength="255" name="birthday" type="text" class="form-control" value="{{ actressss.birthday }}">
    </div><!-- form group -->

    <div class="form-group">
        {{ new_actressss_form.dmmid.errors }}
        <label class="sr-only" for="id_dmmid">Dmmid</label>
        <input id="id_dmmid" name="dmmid" type="number" class="form-control" value="{{ actressss.dmmid }}">
    </div><!-- form group -->

    <div class="form-group">
        <button type="submit" class="btn btn-primary"><i class="fa fa-floppy-o"></i> Save</button>
    </div><!-- form group -->
</form>

{% endblock main %}

forms.py
from django import forms
from .models import ActressMaster

class ActressMasterForm(forms.ModelForm):
    class Meta:
        model = ActressMaster
        fields = '__all__'

StackOverflowなども見ましたが、解決出来ませんでした。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

-1

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

@login_required
def edit(request, id):
    actressss = ActressMaster.objects.get(id=id)
    print "Edit: %s" %actressss.idolname
    
    if request.method == "POST":
        # instanceキーワードを指定する
        new_actressss_form = ActressMasterForm(request.POST or None, instance=actressss)
        print "new_actressss_form post"
        # 以下略
参考:
python - Django edit form based on add form? - Stack Overflow

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/09/06 18: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になるんですね。
    ありがとうございました。

    キャンセル

関連した質問

同じタグがついた質問を見る

  • Python

    8607questions

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

  • Django

    1118questions

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