2010-02-07 8 views
22

Ho un oggetto di database chiamato manor_stats, con circa 30 campi. Per la maggior parte delle righe, la maggior parte di questi campi sarà nullo.Modelli Django: scorrere e stampare tutte le proprietà disponibili di un oggetto?

Nel mio modello, vorrei scorrere tutti i campi nella riga e stampare informazioni solo per i campi che non sono nulli.

Ad esempio, c'è un campo chiamato "nome": mi piacerebbe stampare <li>Name: {{ manor_stats.name }}</li> SOLO nel modello per quegli oggetti in cui il campo non è nullo. Idealmente mi piacerebbe inserire automaticamente "Name:" da qualche parte, piuttosto che specificarlo.

So che potrei usare {% if manor_stats.name %} per verificare se ogni campo è nullo, ma non voglio farlo 30 volte per tutti i campi.

Ecco quello che ho in views.py:

manor_stats = Manors.objects.get(idx=id) 
return render_to_response('place.html', { 'place' : place, 'manor_stats' : manor_stats }, context_instance = RequestContext(request)) 

E poi nel place.html, mi piacerebbe avere qualcosa che funziona circa come questo (pseudocodice, con ??? indicando i bit che non so come fare):

{% if manor_stats %} 
<ul> 
{% for manor_stats.property??? in manor_stats %} 
    {% if manor_stats.property %} 
    <li>{{ manor_stats.property.field_name??? }} {{ manor_stats.property.value??? }}</li> 
    {% endif %} 
{% endfor % 
{% endif %} 

speranza che abbia un senso ...

+2

duplicato esatto: http://stackoverflow.com/questions/2170228/django-iterate-over-model- nome-campo-istanza-e-valori-nel-modello –

risposta

49

si potrebbe aggiungere un metodo per il vostro modello Manors che restituirà tutti i valori di campo, da lì si può solo ciclo continuo su questi valori nel tuo modello controllando se il valore non è nullo.

- models.py

class Manors(models.Model) 
    #field declarations 

    def get_fields(self): 
    return [(field.name, field.value_to_string(self)) for field in Manors._meta.fields] 

- manor_detail.html

{% for name, value in manor_stats.get_fields %} 
    {% if value %} 
    {{ name }} => {{ value }} 
    {% endif %} 
{% endfor %} 
+1

Funziona perfettamente - esattamente quello che stavo cercando. Grazie! – AP257

+1

Sai come potrei restituire field.verbose_name insieme al valore in qualche modo? Immagino che sia solo una questione della giusta sintassi di Django, ma sono sconcertato :( – AP257

+1

Ho apportato alcune modifiche alla mia risposta originale L'attributo del nome allegato al campo dovrebbe darti quello che desideri – buckley

Problemi correlati