2015-02-02 8 views
6

Ich möchte die wenigen felder vom modell in django admin beim ersten speichern deaktivieren.make django model field nur lesen oder deaktivieren in admin beim ersten speichern des objekts

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

so.

Mein Modell ist:

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() 

Ich möchte die "Überschrift" und "n_comments" deaktivieren. Ich habe es in der Datei admin.py versucht, aber es deaktiviert nicht die Felder beim ersten Speichern. Aber zum Bearbeiten der Felder funktioniert es, es macht die Felder nur lesbar.

in admin.py

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

Headling deaktiviert bekommen, aber für die Bearbeitung nur. Ich möchte es zum Zeitpunkt der Objekterstellung deaktivieren. d.h. zuerst speichern. kann mich jemand dafür leiten?

+0

Warum verwenden Sie nicht stattdessen die Eigenschaft readonly_fields? – GwynBleidD

+0

wird es für die Bearbeitung der Objekte nicht für das Erstellen des Objekts zum ersten Mal arbeiten. – Gaurav

+0

Es funktioniert für beide, wenn Sie "get_readonly_fields" nicht überschreiben. – GwynBleidD

Antwort

4

Wenn Sie bei der Erstellung das Feld schreibgeschützt zu machen, sollten Sie es umgekehrt machen:

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

es hat sehr gut funktioniert. Aber es zeigt nicht das Eingabefeld deaktiviert. – Gaurav

+0

Heu funktioniert nicht zum Bearbeiten !!. Während der Bearbeitung ist es nicht deaktiviert. – Gaurav

+0

Sorry, ich habe die Frage missverstanden, dachte du willst sie nur zum erstellen deaktivieren ... sonst einfach immer 'return ['headline']' ... keine Notwendigkeit für die If-Klausel ... –

1

Für sie deaktiviert machen beim Speichern Ausgangsobjekt und für die Bearbeitung auch können wir diese

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

es funktionierte für mich.

26

Es ist nicht notwendig, get_readonly_fields zu überschreiben. Einfachste Lösung wäre:

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

Wenn readonly_fields verwenden Sie nicht get_readonly_fields außer Kraft setzen können, weil Standardimplementierung readonly_fields Variable liest. Überschreibe es also nur, wenn du eine Logik haben musst, um zu entscheiden, welches Feld zur Zeit schreibgeschützt sein soll.

+0

Ich habe keine Ahnung warum Leute benutze deinen einfachen Vorschlag hier nicht –

+0

Dies ist der Weg zu gehen! – LiberiFatali

Verwandte Themen