2014-10-10 10 views
8

Io uso modelli astratti in Django come:Django admin: posso definire l'ordine dei campi?

class Tree(models.Model): 
    parent = models.ForeignKey('self', default=None, null=True, blank=True, 
           related_name="%(app_label)s_%(class)s_parent") 

    class Meta: 
     abstract = True 

class Genre(Tree): 
    title = models.CharField(max_length=150) 

e tutti i campi dal modello astratto andare per primo in pannello di amministrazione di Django:

parent: 
abstract_field2: 
title: 
model_field2: 
... 

C'è un modo per metterli (campi da classi astratte) alla fine della lista?
O un modo più generale per definire l'ordine dei campi?

risposta

16

È possibile ordinare i campi come si desidera utilizzando l'opzione ModelAdmin.fields.

class GenreAdmin(admin.ModelAdmin): 
    fields = ('title', 'parent') 
+0

vogliono anche parlare https://github.com/django-mptt/django-mptt se avete bisogno di una struttura ad albero – Sergey

+0

L'ordine dei campi dipenderà dall'ordine in cui li si dichiara nei propri modelli. In alternativa, puoi ordinare i campi nel modo in cui vorresti che fossero visualizzati nell'amministratore. – acquayefrank

+0

@larry nella domanda, 'parent' è dal modello padre' Tree', e 'title' è dal modello figlio' Genre', quindi non è possibile cambiare l'ordine nell'admin modificando l'ordine nei modelli . – Alasdair

0

so che è una vecchia questione, ma ha voluto thow nei miei due centesimi, dato che il mio caso d'uso era esattamente come questo, ma ho avuto un sacco di modelli che ereditano da una classe, quindi non vuole scrivere campi per ogni amministratore. Ho invece esteso il modello get_form e riorganizzato i campi per garantire che il genitore arrivi sempre alla fine dei campi nel pannello di amministrazione per la vista aggiungi/cambia.

class BaseAdmin(admin.ModelAdmin): 
    def get_form(self, request, obj=None, **kwargs): 
     form = super(BaseAdmin, self).get_form(request, obj, **kwargs) 
     parent = form.base_fields.pop('parent') 
     form.base_fields['parent '] = parent 
     return form 

base_fields è un OrderedDict, quindi questo aggiunge la chiave 'genitore' fino alla fine. Poi, estendere questa amministrazione per tutte le classi in cui si desidera genitore a comparire alla fine:

class GenreAdmin(BaseAdmin): 
    pass 
+0

oh, dovrei aggiungere questo è python 2.7. In python 3 è ancora più semplice, usando form.base_fields.move_to_end ('parent') – rbennell

Problemi correlati