2010-02-17 10 views
5

Tengo una definición de vista que (intenta) genera un modelo como una tabla. Esto es lo que tengo hasta ahora:Modelo Django de salida como tabla

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

Aquí está el código HTML para outputtable.html:

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

¿Qué estoy haciendo mal? No funciona Ahora, está pasando el modelo correctamente, porque si cambio My_Model() a My_Model.objects.all() y luego lo publico como simplemente {{output}}, entonces me muestra lo que vería en el shell de Django.

Respuesta

0

No existe el método as_table en una instancia de modelo (MyModel()) o en los Querysets (MyModel.objects.all()). Es posible que haya visto as_table como the forms method as_table. No tienes un formulario allí.

Si desea imprimir una instancia modelo/un conjunto de consulta como una tabla, tendrá que diseñarlo usted mismo.

0

Si usted está buscando para la producción de un modelo específico, cambiar la plantilla a algo así como

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

para todos los campos que le interesan. Si esto es algo que desea poder hacer para cualquier modelo arbitrario en su aplicación, eche un vistazo a este snippet. Eso le proporcionará una colección de campos para recorrer.

2

Así que lo que hay que hacer es la siguiente:

1) añadir

from django.forms import ModelForm a su models.py

2) añadir

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

3) en sus puntos de vista .py, cambie output = My_Model() a output = My_Model_Form()

Ahora ya está todo listo. Entonces, el truco es heredar su Formulario de su modelo original.

+0

Si está renderizando una instancia de modelo existente, haga 'output = My_Model_Form (instance = my_model)' –

0

OMG esto es viejo, pero Generic Views parece ser una buena opción para este problema, al menos para mí. Una vista detallada de la lista debería ayudarme a correr más rápido. :)

0

Se me ocurrió una solución que funcionaba para mi necesidad específica que convierte los datos de cualquier modelo simple en filas de tablas. Agregue el siguiente filtro en templatetags/your_tags_file.py (no se olvide el archivo en la carpeta __init__.py 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 

En la plantilla ahora sólo puede hacer:

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

Esto hará que el modelo en una mesa simple para ti Puede agregar fácilmente cualquier lógica thead y tbody que desee, modificando la lógica de cómo se genera ret. Espero que esto ayude a alguien.

1

La clase models.Model no tiene un método as_table() como la clase forms.ModelForm.

Mi solución fue utilizar también etiquetas de plantilla. Fui 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 esta aplicación se puede pasar el que los atributos del modelo que desea mostrar y en qué orden.

myapp/views.py

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

También me gusta este código HTML y Python limpiamente separado.

Cuestiones relacionadas