1

そのため、最近 Django 1.4 にアップグレードしましたが、editable=False のモデル フィールドがモデル フォームで処理される方法が変更されていることに気付きました。

次のユーザーモデルがある場合:

class User(models.Model):
    id              = UUIDField(primary_key=True, default=uuid4str)
    name            = models.CharField(max_length=128)

UUIDField は自動的に kwargs['editable'] = False になり、そのモデル フォームを作成しようとします。

class UserFormSelf(ModelForm):
    class Meta:
        model = models.User
        fields = ('id', 'name',)
        widgets = {
        'id': HiddenInput()
            }

実行時に次のエラーが表示されます。

「不明なフィールド (id) がユーザーに指定されました」

ドキュメントによると、False の場合、フィールドは管理者または他の ModelForm に表示されません。デフォルトは真です。. ただし、フィールドは非表示であり、編集されているユーザーを特定できるようにのみ使用されるため、フォームでそれを許可する方法があるはずですよね?

id を編集可能にしたくありませんが、これが唯一の解決策である場合は、編集する必要があるかもしれません。おそらく編集可能かもしれませんが、新しいオブジェクトでない場合は保存時に例外が発生します。ただし、最初に editable=False で実行できるかどうかを確認したいと思います。

ご協力いただきありがとうございます!

編集: id フィールドが編集されているかどうかを確認し、pre_save にカスタムの "editable=False" を書き込むことはできないようです。pre_save は、新しい ID を持つオブジェクトが新しいものであると自動的に判断するためです。上記の回答を提供できないが、これを行う方法を知っている場合は、私にも知らせてください。

4

1 に答える 1

1

自分で値を表示しないのはなぜですか?フォームは入力/出力用であり、レコードが既に存在する場合、おそらく UUID はユーザー側で計算されるか、アプリケーションに認識されます。テンプレートコードを提供していないので例を挙げるのは難しいですが、フォームを表示するために使用している場合は、既存のオブジェクトを編集している場合のas_p()ように何かを追加してください.<p>Id: {{ object.id }}</p>

于 2012-11-19T23:21:16.010 に答える