2012-04-03 18 views
11

Wie kann ich einen Anfangswert eines Felds im automatisch generierten Formular zum Hinzufügen einer Django-Modellinstanz festlegen, bevor das Formular angezeigt wird? Ich benutze Django 1.3.1.Wie setze ich Anfangsdaten für das Django Admin Model ein?

Mein Modell ist folgende:

class Foo(models.Model): 
    title = models.CharField(max_length=50) 
    description = models.TextField() 

und die aktuelle Admin-Form ist wirklich nichts Besonderes

class FooAdmin(admin.ModelAdmin): 
    ordering = ('title',) 

Wenn ich die Admin-Seite verwenden, um eine neue Instanz von Foo hinzuzufügen, erhalte ich eine schöne Form mit leeren Feldern für Titel und Beschreibung. Was ich möchte, ist, dass das Beschreibungsfeld mit einer Vorlage eingestellt ist, die ich durch den Aufruf einer Funktion erhalte.

Mein aktueller besten Versuch bekommen, gibt es dies:

def get_default_content(): 
    return 'this is a template for a Foo description' 

class FooAdminForm(django.forms.ModelForm): 

    class Meta: 
     model = Foo 

    def __init__(self, *args, **kwargs): 
     kwargs['initial'].update({'description': get_default_content()}) 
     super(FooAdminForm, self).__init__(self, *args, **kwargs) 

class FooAdmin(admin.ModelAdmin): 
    ordering = ('title',) 
    form = FooAdminForm 

aber wenn ich das versuche ich diesen Django Fehler:

AttributeError at /admin/bar/foo/add/ 
    'FooForm' object has no attribute 'get' 
Request Method: GET 
Request URL: http://localhost:8000/admin/bar/foo/add/ 
Django Version: 1.3.1 
Exception Type: AttributeError 
Exception Value: 'FooForm' object has no attribute 'get' 
Exception Location: /www/django-site/venv/lib/python2.6/site-packages/django/forms/widgets.py in value_from_datadict, line 178 

Ich weiß nicht, was hier falsch ist, und Was sollte ich tun, damit es funktioniert? Was ich auch an diesem Fehler (abgesehen von der Tatsache, dass ich es überhaupt sehe) seltsam finde, ist, dass es in meinem Code überhaupt kein FooForm gibt?

Antwort

17

Sie müssen self als das erste Argument in Ihrer __init__ Methodendefinition einschließen, aber sollten es nicht einschließen, wenn Sie die superclass 'Methode aufrufen.

def __init__(self, *args, **kwargs): 
    # We can't assume that kwargs['initial'] exists! 
    if not kwargs.get('initial'): 
     kwargs['initial'] = {} 
    kwargs['initial'].update({'description': get_default_content()}) 
    super(FooAdminForm, self).__init__(*args, **kwargs) 

auch sagen, dass ein Modellfeld eine aufrufbare für seine default nehmen, so dass Sie nicht eine benutzerdefinierte Admin-Form überhaupt zu definieren.

class Foo(models.Model): 
    title = models.CharField(max_length=50) 
    description = models.TextField(default=get_default_content) 
+0

Wow, das wie ein Charme! Awesome kryptische Nachricht übrigens für so einen dummen Fehler ... Vielen Dank für Ihre Hilfe! –

+0

Übrigens habe ich auch deinen zweiten Vorschlag erfolgreich versucht, der ist noch sauberer, also nochmals Danke! –

+0

Ich habe festgestellt, dass die Einstellung kwargs ['initial'] beim Speichern des Formulars einen Fehler verursacht hat. Ich hatte eine if-Klausel festgelegt: wenn 'Initiale' in kwargs.keys():.. kwargs [ 'initial'] Update (... Dies funktionierte die Anfangswerte für die Anzeige und die Aktualisierung sie – Sven

7

Mehr als 3 Jahre später Aber eigentlich das, was Sie tun sollten, außer Kraft setzen admin.ModelAdmin formfield_for_dbfield .. wie folgt aus:

class FooAdmin(admin.ModelAdmin): 
    def formfield_for_dbfield(self, db_field, **kwargs): 
     field = super(FooAdmin, self).formfield_for_dbfield(db_field, **kwargs) 
     if db_field.name == 'description': 
      field.initial = 'My initial description' 
     elif db_field.name == 'counter': 
      field.initial = get_counter() + 1 
     return field 

Beifall;

+0

Sehr schön. Es ist seltsam, aber es gibt keine solche Sache in der Dokumentation: https: // docs. djangoproject.com/de/1.8/ref/contrib/admin/ – Wtower

+0

Der Django-Administrator ist leider "zu wenig" dokumentiert. –

15

Alasdairs Ansatz ist nett, aber veraltet. Radevs Ansatz sieht ziemlich gut aus und wie ich im Kommentar erwähnt habe, fällt mir auf, dass es in der Dokumentation nichts darüber gibt.

Abgesehen von denen, da Django 1.7 eine Funktion get_changeform_initial_data in Modeladmin ist, die ursprüngliche Form Werte setzt:

def get_changeform_initial_data(self, request): 
    return {'name': 'custom_initial_value'} 
+0

aus irgendeinem Grund in 1.10.2 wird diese Methode überhaupt nicht aufgerufen, obwohl sie in der Dokumentation vorhanden ist – scythargon

+0

@scythargon Ich habe es gerade in 1.10.2 getestet und für mich funktionierte es wie dokumentiert. – Wtower

+0

Es ist einfach, den Überblick über alle verfügbaren Hooks für ModelAdmin zu verlieren. Danke dafür! –

Verwandte Themen