Вывод модели Django в виде таблицы - PullRequest
6 голосов
/ 17 февраля 2010

У меня есть определение представления, которое (пытается) выводит модель в виде таблицы. Это то, что я до сих пор:

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

Вот HTML-код для outputtable.html:

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

Что я делаю не так? Не работает Теперь он передает модель правильно, потому что если я изменю My_Model () на My_Model.objects.all (), а затем выведу его просто как {{output}}, то он покажет мне, что я вижу в оболочке Django.

Ответы [ 6 ]

2 голосов
/ 05 марта 2010

Итак, вам нужно сделать следующее:

1) добавить

from django.forms import ModelForm в ваш models.py

2) добавить

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

3) в файле views.py измените output = My_Model() на output = My_Model_Form()

Теперь все готово.Таким образом, хитрость заключается в том, чтобы унаследовать вашу форму от вашей исходной модели.

1 голос
/ 17 февраля 2015

Класс models.Model не имеет метода as_table(), как класс forms.ModelForm.

Моим решением было также использовать теги шаблонов. Я пошел с тегом включения .

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>

С помощью этой реализации вы можете передать атрибуты модели, которые вы хотите отобразить и в каком порядке.

myapp/views.py

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

Мне также нравится этот чисто отдельный код HTML и Python.

0 голосов
/ 28 октября 2014

Я пришел к решению, которое работало для моей конкретной потребности, которое отображало данные любой простой модели в строки таблицы. Добавьте следующий фильтр в templatetags/your_tags_file.py (не забудьте файл __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

В шаблоне теперь можно просто сделать:

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

Это сделает модель в простой таблице для вас. Вы можете легко добавить любую желаемую логику thead и tbody по своему усмотрению, изменив логику генерации ret. Надеюсь, это кому-нибудь поможет.

0 голосов
/ 22 декабря 2012

OMG, это старая версия, но Generic Views , кажется, хорошо подходят для этой проблемы, по крайней мере для меня Подробное представление списка должно помочь мне быстрее работать. :)

0 голосов
/ 17 февраля 2010

Если вы просто хотите вывести одну конкретную модель, измените шаблон на что-то вроде

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

для всех полей, которые вас интересуют. Если это то, что вы хотите сделать для любой произвольной модели вашего приложения, взгляните на этот фрагмент . Это даст вам коллекцию полей для повторения.

0 голосов
/ 17 февраля 2010

Нет метода as_table для экземпляра модели (MyModel()) или для наборов запросов (MyModel.objects.all()). Возможно, вы видели as_table как метод форм as_table. У вас там нет формы.

Если вы хотите напечатать экземпляр модели / набор запросов в виде таблицы, вам придется создать ее самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...