【问题标题】:Output Django Model as Table将 Django 模型输出为表
【发布时间】:2011-01-18 00:33:44
【问题描述】:

我有一个视图定义,它(尝试)将模型输出为表格。这是我目前所拥有的:

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

这是 outputtable.html 的 HTML:

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

我做错了什么?它不起作用。现在,它正确地传递了模型,因为如果我将 My_Model() 更改为 My_Model.objects.all(),然后将其简单地输出为 {{ output }},那么它会显示我在 Django shell 中看到的内容。

【问题讨论】:

    标签: django html-table model


    【解决方案1】:

    在模型实例 (MyModel()) 或查询集 (MyModel.objects.all()) 上没有方法 as_table。您可能已经将as_table 视为the forms method as_table。你那里没有表格。

    如果要将模型实例/查询集打印为表,则必须自己设计。

    【讨论】:

      【解决方案2】:

      如果您只是想输出一个特定的模型,请将您的模板更改为类似

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

      对于您关心的所有领域。如果您希望能够对应用程序中的任意模型执行此操作,请查看snippet。这将为您提供一个可以循环的字段集合。

      【讨论】:

        【解决方案3】:

        所以你需要做的是:

        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()

        现在一切就绪。所以诀窍是从您的原始模型继承您的表单。

        【讨论】:

        • 如果您要渲染现有模型实例,请执行output = My_Model_Form(instance=my_model)
        【解决方案4】:

        天哪,这很旧,但Generic Views 似乎很适合这个问题,至少对我来说。列表详细信息视图应该可以帮助我更快地运行。 :)

        【讨论】:

          【解决方案5】:

          我想出了一个适合我特定需求的解决方案,它将任何简单模型的数据呈现到表格行中。将以下过滤器添加到 templatetags/your_tags_file.py 中(不要忘记 templatetags 文件夹中的 __init__.py 文件):

          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>
          

          这将为您在一个简单的表格中呈现模型。您可以通过修改ret 生成方式的逻辑,轻松添加任何所需的theadtbody 逻辑。希望这对某人有所帮助。

          【讨论】:

            【解决方案6】:

            models.Model 类没有 as_table()forms.ModelForm 类那样的方法。

            我的解决方案是也使用模板标签。我选择了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>
            

            通过此实现,您可以传递要显示的模型属性以及显示顺序。

            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 代码。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-05-26
              • 1970-01-01
              • 2018-06-28
              • 2021-11-05
              • 1970-01-01
              • 1970-01-01
              • 2011-09-30
              • 1970-01-01
              相关资源
              最近更新 更多