1

簡単に聞こえるかもしれませんが、答えを探すのに問題があります。私はこのモデルを持っています:

class Page(models.Model):
    creator       = models.TextField(blank=False)
    name          = models.CharField(max_length=70, primary_key=True)
    name_slug     = models.SlugField(max_length=70, unique=True)

管理者で保存するたびに、名前 + 作成者 (例: i_am_legend_cyber_valdez) のスラッグ値を name_slug に渡す事前保存操作 (save_model()) を実行します。管理テンプレートをいじらずに。これは可能ですか?

4

1 に答える 1

2

ModelAdmin.formfield_overrides、ModelAdmin.formfield_for_dbfield、またはカスタム ModelForm のいずれかで、HTML フォーム入力を表示するのではなく、フィールドの値を表示するだけの name_slug フィールドにカスタム ウィジェットを割り当てる必要があります。そのようなウィジェットはここにあります

編集: カスタム ウィジェットの作成の詳細については説明しません。上記でリンクしたものをそのまま使用できます。モデル内のすべての SlugField に対してこのウィジェットを有効にするには、formfield_overridesを使用するのが最も簡単な方法です。

class PageAdmin(admin.ModelAdmin):
    formfield_overrides = {
        models.SlugField: {'widget': ReadOnlyWidget},
    }

モデルに複数の SlugField があり、そのうちの 1 つにのみ ReadOnlyWidget を適用したい場合は、 formfield_for_dbfield メソッドをオーバーライドします。

class PageAdmin(admin.ModelAdmin):
    def formfield_for_dbfield(self, db_field, **kwargs):
        if db_field.name == 'name_slug':
            kwargs['widget'] = ReadOnlyWidget
        return super(PageAdmin, self).formfield_for_dbfield(db_field, **kwargs)

モデル用に完全にカスタマイズされた ModelForm を作成し、それを ModelAdmin の form 属性に割り当てることもできますが、より深いカスタマイズを行う場合を除き、これは必要ありません。

于 2009-06-16T11:29:00.173 に答える