2010-02-17 5 views
5

Ho una definizione di vista che (tenta di) emette un modello come tabella. Questo è quello che ho finora:Output Django Model as Table

def output_table(request): 
    output = My_Model() 
    return render_to_response('outputtable.html', {'output': output}) 

Ecco il codice HTML per outputtable.html:

<html> 
<table> 
    {{ output.as_table }} 
</table> 
</html> 

Che cosa sto facendo di sbagliato? Non funziona. Ora, passa il modello correttamente, perché se cambio My_Model() in My_Model.objects.all() e poi lo metto in uscita semplicemente {{output}}, allora mi mostra cosa vedrei nella shell di Django.

risposta

0

Non esiste alcun metodo as_table su un'istanza di modello (MyModel()) o su Querysets (MyModel.objects.all()). Potresti aver visto as_table come the forms method as_table. Non hai un modulo lì.

Se si desidera stampare un'istanza di modello/un queryset come tabella, sarà necessario progettarlo da soli.

0

Se stai solo cercando di uscita un modello specifico, modificare il modello a qualcosa come

<tr> 
    <td>Name:</td> 
    <td>{{ output.name}}</td> 
</tr> 

per tutti i campi che ti interessano. Se questo è qualcosa che vuoi essere in grado di fare per qualsiasi modello arbitrario nella tua app, dai un'occhiata a questo snippet. Ciò ti fornirà una raccolta di campi da ripetere.

2

Così che cosa dovete fare è la seguente:

1) aggiungere

from django.forms import ModelForm al models.py

2) aggiungere

class My_Model_Form(ModelForm): 
      class Meta: 
       model = My_Model 

3) nelle viste .py, cambia output = My_Model() a output = My_Model_Form()

Ora siete tutti a posto. Quindi il trucco è ereditare il tuo modulo dal tuo modello originale.

+0

Se si esegue il rendering di un'istanza di modello esistente, eseguire 'output = My_Model_Form (instance = my_model)' –

0

OMG questo è vecchio ma Generic Views sembra essere una buona misura per questo problema, almeno per me. Una vista dettagliata dell'elenco dovrebbe aiutarmi a correre più velocemente. :)

0

Mi è venuta in mente una soluzione che ha funzionato per la mia specifica esigenza, che rende i dati di qualsiasi modello semplice in righe di tabella. Aggiungere il seguente filtro nella templatetags/your_tags_file.py (non dimenticate il file __init__.py nella cartella templatetags):

from django import template 
register = template.Library() 

@register.filter() 
def as_table(model): 
    ret = "" 
    for name in model._meta.get_all_field_names(): 
     try: 
      field = str(getattr(model, name)) 
      if field: 
       ret += '<tr><td class="name">'+name+'</td><td class="field">'+field+'</td></td>' 
     except AttributeError: 
      pass 
    return ret 

Nel modello ora si può solo fare:

{% load your_tags_file %} 
<table> 
    {{output|as_table|safe}} 
</table> 

Questo renderà il modello in un semplice tavolo per te. È possibile aggiungere facilmente qualsiasi logica desiderata thead e tbody modificando la logica di come viene generato ret. Spero che questo aiuti qualcuno.

1

La classe models.Model non ha un metodo as_table() come la classe forms.ModelForm.

La mia soluzione era utilizzare anche i tag modello. Sono andato con un inclusion tag.

myapp/templatetags/model_helpers.py

from django import template 
register = template.Library() 


@register.inclusion_tag('myapp/model_table.html', takes_context=True) 
def model_as_table(context, model_key=None, model_table_attrs_key=None): 

    if model_key is None: 
     model_key = 'object' 

    if model_table_attrs_key is None: 
     model_table_attrs_key = 'model_table_attrs' 

    try: 
     attrs = context[model_table_attrs_key] 
    except KeyError: 
     attrs = context[model_key]._meta.get_all_field_names() 

    table_context = {'rows': []} 
    for attr in attrs: 
     try: 
      value = str(getattr(context[model_key], attr)) 
      if value: 
       table_context['rows'].append({'attr': attr, 
               'value': context[model_key][attr]}) 
     except AttributeError: 
      pass 
     # Needs a way to display many_to_many fields. 
     except StopIteration: 
      pass 

    return table_context 

myapp/templates/myapp/model_table.html

{% for row in rows %} 
    <tr> 
     <td class="name">{{ row.attr }}</td> 
     <td class="field">{{ row.value }}</td> 
    </tr> 
{% endfor %} 

myapp/templates/myapp/outputtable.html

{% load model_helpers %} 

<table> 
    {% model_as_table %} 
</table> 

Con questa implementazione è possibile passare gli attributi del modello che si desidera visualizzare e in quale ordine.

myapp/views.py

def output_table(request): 
    output = My_Model() 
    return render_to_response('outputtable.html', 
           {'output': output, 'model_table_attrs': ['attr1', 'attr2']}) 

mi piace anche questo codice html e pitone in modo pulito separata.