2013-03-05 6 views
5

Próbuję utworzyć jedno pole w zestawach pól Django administratora, aby wyświetlać tylko niektóre dane, ale zgodnie z django document pokazano tylko przykład list_display, aby można było dostosować. Próbowałem podobnego podejścia na fieldsets jak następuje:Administrator django: Jak dostosować jedno pole w zestawach pól?

W models.py:

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

W admin.py, to nie będzie działać:

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

Jeśli jednak zrobić to:

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

ports_with_same_scanner działa dobrze. Problem polega na tym, że nie chcę zmienić wyświetlacza z fieldsets na list_display, zastanawiam się, w jaki sposób mogę osiągnąć tę samą funkcjonalność. Dzięki.

Odpowiedz

5

Czy to działa, aby zastosować filtr na poziomie modelu? Jeśli tak, możesz użyć atrybutu limit_choices_to na modelu ForeignKeyField. Możliwe jest zastąpienie atrybutuklasy modelAdmin.

Coś -

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) 

(Przepraszam jeśli ja źle na pytanie)

+1

Ponieważ ' ports_with_same_scanner' nie jest faktycznym polem w Modelu, jak powyższy kod się nie sprawdza? Jeśli spróbuję zdefiniować pole inne niż model w mojej definicji 'fieldsets', Django utworzy pole' FieldError: Unknown field (s) (my_field_1, my_field_2) określone dla MyModel. Sprawdź pola/zestawy pól/wyklucz atrybuty klasy MyModelAdmin. ", A to zepsuje, ZANIM wywoła metodę" formfield_for_foreignkey() ". W jaki sposób definiujesz 'ports_with_same_scanner' w sposób, który sprawia, że ​​Django jest szczęśliwy? – Troy

1

nie wiem czy prawdziwy problem w przeszłości ... I zawsze za pomocą prostego podejścia - na dodanie wymienić metody do readonly_fields =()

przykład:

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',) 

Należy pracować Django> = 1.7 Wydaje się, że podejście można zastosować do wczesnej wersji Django^ale ja nie testuje

+0

Działa również z Django V.1.3.7 – Derrick