Django - 如何使用 ListView 和 Template 显示模型的所有字段?

Aki*_*ori 0 python django

我想创建如下所示的 HTML 模板。

\n\n

\xe3\x83\xbbmodels.py

\n\n
class Client(Model):\nname = CharField(max_length=50)\nemail = EmailField(max_length=100, verbose_name="E-mail")\ntitle = CharField(max_length=50)\ndepartment = CharField(max_length=50)\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe3\x83\xbbData

\n\n
| Name | Mail | Title | Department |\n| John | john@mailaddress.com | engineer | development |\n| Bob | bob@mailaddress.com | engineer | development |\n| Sam | sam@mailaddress.com | engineer | development |\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe3\x83\xbbviews.py

\n\n
class myListView(, ListView):\nmodel = Client\ntemplate_name = "template.html"\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe3\x83\xbbtemplate.html

\n\n
       <table>\n          <tbody>\n          {% for item in object_list %}\n            <tr>\n              <td>{{ item }}</td>\n            </tr>\n          {% endfor %}\n          <!--- table items end -->\n          </tbody>\n        </table>\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe3\x83\xbb期望(表)

\n\n
| John | john@mailaddress.com | engineer | development |\n| Bob | bob@mailaddress.com | engineer | development |\n| Sam | sam@mailaddress.com | engineer | development |\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n

bin*_*npy 5

基本上,在模板中渲染模型就像这样;

{% for item in object_list %}
  <tr>
    <td>{{ item.name }}</td>
    <td>{{ item.email }}</td>
    <td>{{ item.title }}</td>
    <td>{{ item.department }}</td>
  </tr>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

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

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}
Run Code Online (Sandbox Code Playgroud)

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

{% for item in object_list %}
  <tr>
    <td>{{ item.get_string_fields }}</td>
  </tr>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用__str__ (Python3)__unicode__ (Python2)返回与get_string_fields(self)上面相同的函数。然后,如果您在模板中渲染以下内容{{ item }},应该返回您从函数中获得的__str__内容__unicode__


其他可选

_meta像这样使用答案model._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)
Run Code Online (Sandbox Code Playgroud)