2013-03-05 14 views
5

Ich versuche ein Feld in django admin Feldsets zu erstellen, um nur bestimmte Daten anzuzeigen, aber gemäß django document wird nur ein Beispiel von list_display angezeigt, um anpassen zu können. Ich versuchte, den ähnlichen Ansatz auf fieldsets wie folgt aus:django admin: Wie kann ein Feld in Feldsets angepasst werden?

In models.py:

def ports_with_same_scanner(self): 
    return PortList.objects.filter(scanner=self.scanner) 
ports_with_same_scanner.short_description = 'port_lists' 

In admin.py, das wird nicht funktionieren:

fieldsets = (
      ('Scan Template', { 
      'fields': (('name', 'scanner', 'ports_with_same_scanner',), 'comment', ('in_use', 
       'fc_growing', 'nc_growing'), 'nvt_prefs') 
      }), 
) 

Allerdings, wenn ich tun dies:

list_display = ('name', 'scanner', 'ports_with_same_scanner', 'comment', 'in_use', 'fc_growing', 'nc_growing', 'nvt_prefs') 

die ports_with_same_scanner funktioniert gut. Das Problem ist, dass ich nicht meine Anzeige von fieldsets zu list_display ändern möchte, frage ich mich, wie ich die gleiche Funktionalität erreichen kann. Vielen Dank.

Antwort

5

Würde es funktionieren, den Filter auf Modellebene anzuwenden? Wenn ja, können Sie das Attribut limit_choices_to auf ForeignKeyField des Modells verwenden.

Alternativ können Sie das formfield_for_foreignkey Attribut der ModelAdmin Klasse überschreiben.

So etwas wie -

class YourModelAdmin(admin.ModelAdmin): 
    def formfield_for_foreignkey(self, db_field, request, **kwargs): 
     if db_field.name == "ports_with_same_scanner": 
      kwargs["queryset"] = PortList.objects.filter(scanner=self.scanner) 
     return super(YourModelAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs) 

(Entschuldigt, wenn ich habe die Frage falsch verstanden)
+1

Seit ' ports_with_same_scanner' ist kein tatsächliches Feld auf dem Modell, wie geht der obige Code nicht fehl? Wenn ich versuche, ein Nicht-Modell-Feld in meiner 'fieldsets' Definition zu definieren, wird Django mit' FieldError: Unbekanntes Feld (my_field_1, my_field_2) für MyModel arbeiten. Überprüfen Sie Felder/Feldgruppen/Attribute der Klasse MyModelAdmin.aus, und es wird ausgebrochen, BEVOR es die Methode 'formfield_for_foreignkey()' aufruft. Wie definierst du 'ports_with_same_scanner' auf eine Weise, die Django glücklich macht? – Troy

1

Ich weiß nicht, ob echtes Problem in Vergangenheit ... Ich einfachen Ansatz immer mit - auf einer Zugabe Name der Methode zum readonly_fields =()

Beispiel:

models.py

class My(models.Model): 

    def custom_name(self): 
     return 'test' 
    custom_name.allow_tags = False 
    custom_name.short_description = _('custom_name') 

admin.py

class MyAdmin(admin.ModelAdmin): 
    fieldsets = (
      (None, { 
        'fields': ('sutom_name',) 
      }), 
    ) 
    readonly_fields = ('custom_name',) 

Es muss funktionieren Django> = 1.7 Es ist der Ansatz scheint frühe Version von Django anzuwenden sein kann^aber ich nicht testen

+0

Funktioniert auch mit Django V.1.3.7 – Derrick

Verwandte Themen