web-dev-qa-db-ja.com

make Djangoモデルフィールドを読み取り専用にするか、オブジェクトを初めて保存するときに管理者で無効にします

Django adminのモデルからいくつかのフィールドを無効にして、最初の保存時に管理したい。

"<input type="text" id="disabledTextInput" class="form-control" placeholder="Disabled input">"

このような。

私のモデルは:

class Blogmodel(models.Model):
    tag = models.ForeignKey(Tag)
    headline = models.CharField(max_length=255)
    image=models.ImageField(upload_to=get_photo_storage_path, null=True, blank=False)
    body_text = models.TextField()
    pub_date = models.DateField()
    authors = models.ForeignKey(Author)
    n_comments = models.IntegerField()

「見出し」と「n_comments」を無効にしたい。私はそれをadmin.pyファイルで試しましたが、それは最初の保存でフィールドを無効にしません。ただし、フィールドを編集すると、フィールドが読み取り専用になります。

admin.py

class ItemAdmin(admin.ModelAdmin):
    exclude=("headline ",)
    def get_readonly_fields(self, request, obj=None):
        if obj:
            return ['headline']
        else:
            return []

ヘッドリングは無効になりますが、編集のみです。オブジェクト作成時に無効にしたい。つまり、最初に保存します。誰かがこれを案内してくれますか?

13
Gaurav

作成中にフィールドを読み取り専用にする場合は、逆の方法で行う必要があります。

def get_readonly_fields(self, request, obj=None):
    if obj is None:
        return ['headline']
    return []
6

get_readonly_fieldsをオーバーライドする必要はありません。最も簡単な解決策は次のとおりです。

class ItemAdmin(admin.ModelAdmin):
    exclude=("headline ",)
    readonly_fields=('headline', )

readonly_fieldsを使用する場合、デフォルトの実装はreadonly_fields変数を読み取るため、get_readonly_fieldsをオーバーライドすることはできません。そのため、どのフィールドを読み取り専用にするかを決定するロジックが必要な場合にのみ、オーバーライドします。

50
GwynBleidD

初期オブジェクトの保存中に無効にするため、および編集のためにこれを行うことができます

class ItemAdmin(admin.ModelAdmin):
    def get_readonly_fields(self, request, obj=None):
        if obj is None:
            return ['headline']
        else:
            return ['headline']
        return []

それは私のために働いた。

0
Gaurav