5

次のことを前提とします。

models.py

class Entry(models.Model):
    title = models.CharField(max_length=50)
    slug = models.CharField(max_length=50, unique=True)
    body = models.CharField(max_length=200)

admin.py

class EntryAdmin(admin.ModelAdmin):
    prepopulated_fields = {'slug':('title',)}

スラッグにタイトルを事前入力したいのですが、ユーザーが管理者から編集できるようにしたくありません。fields=[] を管理オブジェクトに追加し、スラッグを含めないとうまくいくと思いましたが、うまくいきませんでした。また、モデルで editable=False を設定しようとしましたが、それも機能しませんでした (実際、ページのレンダリングが停止します)。

考え?

4

5 に答える 5

4

この特定のケースでは、保存メソッドをオーバーライドしてタイトルをスラッグ化し(組み込みメソッドです。djangoソースを見てください)、スラッグフィールドに保存できます。また、そこから、このスラッグが本当に一意であるかどうかを簡単に確認し、そうでない場合は何らかの方法で変更できます。

次の例を検討してください。

def save(self):
    from django.template.defaultfilters import slugify

    if not self.slug:
        self.slug = slugify(self.title)

    super(Your_Model_Name,self).save()
于 2008-09-29T15:47:49.380 に答える
0

save必要な生成値を提供するためにオーバーライドすることに加えて、クラスで除外オプションを使用しModelAdminて、フィールドが管理者に表示されないようにすることもできます。

class EntryAdmin(admin.ModelAdmin):
    exclude = ('slug',)
于 2008-09-29T19:36:30.860 に答える
0

このDjango スニペットは、カスタムの読み取り専用ウィジェットを定義することで、必要なことを行います。そのため、実際には編集を許可しないフィールドのカスタム エディターを定義します。

于 2008-09-29T15:27:55.387 に答える
0

あなたが求めていることが可能かどうかわかりません。あなたの最善の策は、フィールドセットを指定して管理インターフェイスからスラッグを完​​全に非表示にし、save メソッドをオーバーライドしてタイルからスラッグをコピーし、潜在的にスラッグ化することです...

于 2008-09-29T15:04:04.057 に答える
0

このスニペットは、まさに求めている動作を備えた AutoSlugField を提供し、それをモデルに追加するのはワンライナーです。

于 2008-09-29T19:20:53.813 に答える