【问题标题】:Django - How to show all fields of model with ListView and Template?Django - 如何使用 ListView 和模板显示模型的所有字段?
【发布时间】:2017-07-24 01:21:41
【问题描述】:

我想创建如下 HTML 模板。

・models.py

class Client(Model):
name = CharField(max_length=50)
email = EmailField(max_length=100, verbose_name="E-mail")
title = CharField(max_length=50)
department = CharField(max_length=50)

・数据

| Name | Mail | Title | Department |
| John | john@mailaddress.com | engineer | development |
| Bob | bob@mailaddress.com | engineer | development |
| Sam | sam@mailaddress.com | engineer | development |

・views.py

class myListView(, ListView):
model = Client
template_name = "template.html"

・template.html

       <table>
          <tbody>
          {% for item in object_list %}
            <tr>
              <td>{{ item }}</td>
            </tr>
          {% endfor %}
          <!--- table items end -->
          </tbody>
        </table>

・期望(表)

| John | john@mailaddress.com | engineer | development |
| Bob | bob@mailaddress.com | engineer | development |
| Sam | sam@mailaddress.com | engineer | development |

我不想在模板文件中写入所有键,因为我的产品数据列太多。

你能告诉我如何制作模板吗?

【问题讨论】:

    标签: python django


    【解决方案1】:

    基本上,在模板中渲染你的模型是这样的;

    {% for item in object_list %}
      <tr>
        <td>{{ item.name }}</td>
        <td>{{ item.email }}</td>
        <td>{{ item.title }}</td>
        <td>{{ item.department }}</td>
      </tr>
    {% endfor %}
    

    但是,如果您不想在模板文件中写入所有键。你也可以在你的模型中处理它。一个例子:

    class Client(Model):
        name = CharField(max_length=50)
        email = EmailField(max_length=100, verbose_name="E-mail")
        title = CharField(max_length=50)
        department = CharField(max_length=50)
    
        def get_string_fields(self):
            return '%(name)s - %(email)s - %(title)s - %(department)s' % {
                'name': self.name, 'email': self.email, 
                'title': self.title, 'department': self.department}
    

    然后,在你的模板中应该是..

    {% for item in object_list %}
      <tr>
        <td>{{ item.get_string_fields }}</td>
      </tr>
    {% endfor %}
    

    或者,您可以使用__str__ (Python3)__unicode__ (Python2),它们返回与上述get_string_fields(self) 相同的函数。那么,如果你在{{ item }} 之后的模板中渲染,应该返回你从__str____unicode__ 函数得到的内容。


    其他可选

    像这样answer 使用_metamodel._meta.get_all_field_names() 将为您提供模型的所有字段名称,然后您可以使用 model._meta.get_field() 获取详细名称,并使用 getattr(model_instance, 'field_name') 从模型中获取值。

    注意:model._meta.get_all_field_names() 在 django 1.9 中已弃用。而是使用model._meta.get_fields() 获取模型的字段,使用field.name 获取每个字段名称。一个例子:

    class Client(Model):
        name = CharField(max_length=50)
        email = EmailField(max_length=100, verbose_name="E-mail")
        title = CharField(max_length=50)
        department = CharField(max_length=50)
    
        def get_string_fields(self):
            # list of some excluded fields
            excluded_fields = ['id', 'pk']
    
            # getting all fields that available in `Client` model,
            # but not in `excluded_fields`
            field_names = [field.name for field in Client._meta.get_fields() 
                           if field.name not in excluded_fields]
            values = []
            for field_name in field_names:
                # get specific value from instanced object.
                # and outputing as `string` value.
                values.append('%s' % getattr(self, field_name))
    
            # joining all string values.
            return ' | '.join(values)
    

    【讨论】:

    • 非常感谢,但答案显示在一列中的所有数据。不过,我想我可以找到解决办法。
    猜你喜欢
    • 2012-04-19
    • 2012-04-23
    • 2015-07-28
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多