显示对象django表

Lim*_* H. 7 python django django-templates django-models django-views

我需要使用Django从我的数据库中显示一个表.显而易见的方法是手动输入表格标题并循环查询结果model.objects.all().但是,由于非常懒惰,我想自动执行此操作,即从模型加载所有字段到内省以显示为列标题并加载所有字段值以显示为行.这种方法也可以节省一些时间,因为我不需要在模型更改时更新模板代码.我得到了它的工作,但有两个问题:

  1. 我无法找到加载AutoField字段(id)值,所以我必须切掉ID列.
  2. 代码看起来非常混乱,特别是使用随机模板标签.

这是我的代码.请注意代码工作正常,所以我会跳过所有导入,因为它们是正确的:

views.py我使用序列化器来序列化数据,这是我在stackoverflow上读到的一个技巧

def index(request):
   fields    = MyModel._meta.fields
   data      = serializers.serialize("python", MyModel.objects.all())
   context_instance = RequestContext(request, {    
       'data'      : data,
       'fields'    : fields,
   })
   return TemplateResponse(request, 'index.html', context_instance)
Run Code Online (Sandbox Code Playgroud)

template/index.html:请注意,我必须通过切掉字段列表的第一个元素来切掉ID列

{% with fields|slice:"1:" as cached_fields %}
<table>
    <thead>
        <tr>
            {% for field in cached_fields %}
                <th>{% get_verbose_name field %}</th>
            {% endfor %}
        </tr>
    </thead>
    <tbody>
        {% for instance in data %}
        <tr>
            {% for field in cached_fields %}
                <td>{% get_value_from_key instance.fields field %}</td>
            {% endfor %}
        </tr>
        {% endfor %}
    </tbody>
</table>
{% endwith %}
Run Code Online (Sandbox Code Playgroud)

templatetags/extra_tags.py

# tag to get field's verbose name in template 
@register.simple_tag
def get_verbose_name(object):
    return object.verbose_name

# tag to get the value of a field by name in template
@register.simple_tag
def get_value_from_key(object, key):
    # is it necessary to check isinstance(object, dict) here? 
    return object[key.name]
Run Code Online (Sandbox Code Playgroud)

Vid*_*dul 6

serializers.serialize("jsonxml", Model.objects.all())格式返回id字段; 可能不是你想要的,但一些jQuery网格插件可以进一步自动化任务.


Gly*_*son 5

看看这应该从你的模型中为你自动化很多这个. http://django-tables2.readthedocs.org/en/latest/


Lim*_* H. 2

耶!我找到了解决办法,感谢 \xd0\x92\xd0\xb8\xd0\xb4\xd1\x83\xd0\xbb \xd0\x9f\xd0\xb5\xd1\x82\xd1\x80\xd0\xbe\xd0\ xb2 关于将数据序列化为 json 的建议,这也允许我加载 pk 字段。它仍然感觉过于手动和黑客(而且冗长),但我想我已经接近了。请帮助我进一步重构这段代码。

\n\n
\n

views.py将数据序列化为 JSON 对象列表并将其解析为字典列表以将其传递给模板

\n
\n\n\n\n
from django.utils import simplejson as json    \n\ndef index(request):\n   fields    = MyModel._meta.fields\n   data      = json.loads(serializers.serialize("json", MyModel.objects.all()))\n\n   def parse_data(data):\n\n        result = [] \n\n        # flatten the dictionary\n        def flatten_dict(d):\n            """ \n            Because the only nested dict here is the fields, let\'s just\n            remove the \'fields\' suffix so that the fields can be loaded in \n            template by name\n            """\n            def items():\n                for key, value in d.items():\n                    if isinstance(value, dict):\n                        for subkey, subvalue in flatten_dict(value).items():\n                            yield subkey, subvalue\n                    else:\n                        yield key, value\n\n            return dict(items())\n\n        for d in data:\n            # change the \'pk\' key name into its actual name in the database\n            d[Employee._meta.pk.name] = d.pop(\'pk\') \n            # append the flattend dict of each object\'s field-value to the result \n            result.append(flatten_dict(d))\n\n        return result\n\n\n   context_instance = RequestContext(request, {    \n       \'data\'      : parse_data(data),\n       \'fields\'    : fields,\n   })\n   return TemplateResponse(request, \'index.html\', context_instance)\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

template/index.html模板现在好多了

\n
\n\n\n\n
<table>\n    <thead>\n        <tr>\n            {% for field in cached_fields %}\n                <th>{% get_verbose_name field %}</th>\n            {% endfor %}\n        </tr>\n    </thead>\n    <tbody>            \n            {% for d in data %}\n                <tr>\n                    {% for field in fields %}\n                        <td>{% get_value_from_key d field %}</td>\n                    {% endfor %}\n                </tr>\n            {% endfor %}            \n    </tbody>\n</table>\n
Run Code Online (Sandbox Code Playgroud)\n