2011-09-15 18 views

risposta

10

Non è possibile accedere a verbose_name direttamente dal modello. Da quello che vedo tu hai tre opzioni.

Opzione uno (il più semplice). Assegnare il nome verbose nel controller e quindi accedervi dal modello:

# in controller 
render_to_response('template.html', {'scrib_verbose_name': Scrib._meta.verbose_name}) 

# in a view template.html 
Verbose name of a Scrib model: {{ scrib_verbose_name }} 

Opzione due: scrivere voi stessi un aiutante vista che restituirà il verbose_name (o altro campo dalla classe _meta) per una determinata classe.

Aggiornamento Terza opzione (una punta di cappello per Uku Loskit) - definire un metodo su un modello di scrittura che restituisce il meta oggetto (o qualsiasi campo particolare da esso).

# method in a Scrib model 
def meta(self): 
    return self._meta 

# later on in a template - scrib is a instance of Scrib model 
<h1>{{ scrib.meta.verbose_name }}</h1> 

Update2 Se ti ostini a accedendo direttamente nome verbose dalla scribs (che è il risultato di Scrib.objects.all()), allora si può fare cose del genere:

scribs = Scrib.objects.all() 
scribs.verbose_name = Scrib._meta.verbose_name 

# in a template you can now access verbose name from a scribs variable 
{{ scribs.verbose_name }} 

Update3 Ancora un altro modo andare sta usando il modello inhertinace per poter accedere al nome dettagliato dall'istanza di qualsiasi modello che eredita da quello personalizzato.

# base model (inherits from models.Model) 
class CustomModel(models.Model): 
    def meta(self): 
     return self._meta 

    class Meta: 
     abstract = True 

# Scrib now inherit from CustomModel 
class Scrib(CustomModel): 
    # do any stuff you want here ... 

Scrib ora eredita da CustomModel che ci fornisce con la proprietà meta. Ogni modello che erediterà dalla classe CustomModel avrà questa proprietà. È la soluzione più pulita e flessibile.

+0

realtà 'scribs' è uguale t o 'Scrib.objects.all()' quindi è un oggetto multiplo. Devo mettere 'Scrib' invece' Scrib.objects.all() 'in' scribs'? –

+0

Beh, se si esegue il looping del modello tramite gli scribs, è possibile utilizzare '.meta.verbose_name' su ogni istanza di scrib in un ciclo. Se si desidera visualizzarlo solo una volta (prima del ciclo effettivo, ad esempio), è possibile eseguire semplicemente '{{scribs.0.meta.verbose_name}}' per visualizzare un nome dettagliato utilizzando il primo elemento di scrittura in un array di scribs. – WTK

+0

Non posso inserire direttamente il modello 'Scrib' in' scribs', scorrere in 'scribs.objects.all' e usare' scribs.verbose_name' o qualcosa di più semplice? Altrimenti dovrò mettere questa funzione su tutti i miei modelli? –

5

alternativa al suggerimento di WTK si potrebbe definire un metodo per il modello Scrib nel vostro models.py come questo:

def get_verbose_name(self): 
    return self._meta.verbose_name 
# in templates 
{{ scrib_instance.get_verbose_name }} 
+0

Devo creare questo metodo per tutti gli oggetti in cui ho bisogno del nome dettagliato o esiste un modo più semplice? –

+1

@PierredeLESPINAY È possibile avere un modello astratto di base e estenderne tutti i modelli. Scrivi una volta, usa dappertutto. – Chris

8

voglio fare anche questo, suppongo un'altra soluzione potrebbe essere un filtro modello:

from django import template 
register = template.Library() 

@register.filter 
def verbose_name(value): 
    return value._meta.verbose_name 

@register.filter 
def verbose_name_plural(value): 
    return value._meta.verbose_name_plural 

Poi nel modello:

1 {{ object|verbose_name }}, 2 {{ object|verbose_name_plural }} 

1 scrib, 2 scribs 
Problemi correlati