8

django には、多対多で接続されているモデルがいくつかあります。これらのモデルのインスタンスをメモリに作成し、(ビュー テンプレート内のカスタム メソッド呼び出しを介して) ユーザーに提示し、ユーザーが満足すればデータベースに保存します。

ただし、モデル インスタンスに対して何かを実行しようとすると (レンダリング メソッドを呼び出すなど)、最初にインスタンスを保存する必要があるというエラー メッセージが表示されます。ドキュメントによると、これはモデルが多対多の関係にあるためです。

オブジェクトをユーザーに提示し、データベースを乱雑にすることなくオブジェクトを保存または破棄できるようにするにはどうすればよいですか?

(トランザクション処理をオフにして、プロジェクト全体を通して自分で行うこともできると思いますが、これは潜在的にエラーが発生しやすい手段のように思えます...)

どうも!

4

3 に答える 3

6

オブジェクトが「ドラフト」か「ライブ」かを示すフィールドを追加します。そうすれば、それらはリクエスト、セッションなどの間で永続化され、django は不平を言うのをやめます。

次に、パブリック ビューで「ライブ」オブジェクトのみを表示し、それらを作成したユーザーには「ドラフト」オブジェクトのみを表示するようにオブジェクトをフィルター処理できます。これは、「アーカイブされた」オブジェクト (または意味のあるその他の状態) を許可するように拡張することもできます。

于 2009-02-05T22:34:11.263 に答える
4

このドキュメントで概説されているように、djangoフォームを使用することが答えかもしれないと思います(m2mを検索してください...)。

同じ問題を抱えている可能性のある他の人々のための説明を追加するために編集されました:

次のようなモデルがあるとします。

from django.db import models
from django.forms import ModelForm

class Foo(models.Model):
    name = models.CharField(max_length = 30)

class Bar(models.Model):
      foos = models.ManyToManyField(Foo)

  def __unicode__(self):
      return " ".join([x.name for x in foos])

その場合、保存されていないBarオブジェクトに対してunicode()を呼び出すことはできません。保存する前に印刷したい場合は、次のようにする必要があります。

class BarForm(ModelForm):
    class Meta:
        model = Bar

def example():      
    f1 = Foo(name = 'sue')
    f1.save()
    f2 = foo(name = 'wendy')
    f2.save()
    bf = BarForm({'foos' : [f1.id, f2.id]})
    b = bf.save(commit = false)
    # unfortunately, unicode(b) doesn't work before it is saved properly,
    # so we need to do it this way: 
    if(not bf.is_valid()):
        print bf.errors
    else:
        for (key, value) in bf.cleaned_data.items():
            print key + " => " + str(value)

したがって、この場合、Fooオブジェクトを保存しておく必要があり(オブジェクトを保存する前に、独自のフォームを使用して検証できます)、モデルを多対多のキーで保存する前に、それらも検証できます。データを保存するのが早すぎて、データベースを台無しにしたり、トランザクションを処理したりする必要はありません...

于 2009-02-06T07:52:11.263 に答える