在Django中将对象存储到字典中

时间:2016-04-09 14:31:13

标签: python html django

在我的数据库中,我存储了一些错误,因此我可以轻松地在视图之间发送它们。这是我的models.py:

class Errors(models.Model):
    error_number = models.IntegerField(primary_key=True)
    error_message = models.CharField(max_length=45)
    status = models.BooleanField(default=0)
    datetime = models.DateTimeField(auto_now=True)

我想将错误放入字典中,以便我可以将其传递给模板。我希望只有当状态为True / 1时才会发生这种情况。视图是否采用正确的方法来执行此操作?

现在我认为这是一个糟糕的程序,因为我在调用Errors.objects.all()时充斥着newtwork,但我不知道如何实现for循环。

def index(request):
    err = {'error_numbers':[], 'error_messages': [], 'datetime':[], 'test':[]}

    warnings = Errors.objects.all()

    for warning in warnings:
        if Errors.objects.filter(status='1'):
            err['error_numbers'].append(warning.error_number)
            err['error_messages'].append(warning.error_message)
            err['datetime'].append(warning.datetime)

    return render(request, "index.html", err)

我是否还可以问我如何将所有相同错误的数据分组,即模板中的错误号,错误消息和日期时间一起显示? (P.S.我确实意识到在SO中要求代码是禁止的,因此对任何愿意分享一些有用网站或示例的人来说都是可选的。)

示例(正如我在moemnt中使用的那样)波纹管根本不打印任何内容。

<ul>
{% for key, value in err.iteritems %}
     <li>{{key}: {{value}}</li>
{% endfor %}
</ul>

1 个答案:

答案 0 :(得分:1)

您要分享的代码有很多话要说。

首先,我不确定为什么你真的需要一个具有这种结构的字典。你想要的输出是什么?

其次,这段代码很可疑:

for warning in warnings:
    if Errors.objects.filter(status='1'):
        ....

statusBooleanField。你应该用布尔值过滤它。另一方面,为什么需要在迭代中过滤掉整个数据库?你的意思是这样吗?

for warning in warnings:
    if warning.status:
        ...

另一件事是你选择的命名。为模型赋予单数名称是一种更好的做法。使用Error代替Errors

如果你真的需要做这样的事情。我建议你使用collections.defaultdict。它将允许动态添加list密钥。

from collections import defaultdict
err = defaultdict(list)

for warning in warnings:
    if warning.status:
        err['error_numbers'].append(warning.error_number)
        err['error_messages'].append(warning.error_message)
        err['datetime'].append(warning.datetime)

但同样,你似乎想要实现一些hacky。您应该重新考虑您的需求和方法。

毕竟这应该打印出每个键的一个键和一个列表。

<ul>
{% for key, values in err.iteritems %}
 <li>{{key}}:    #edited here, 1 "}" was missing
     {% for value in values %}{{value}}{% endfor %}
 </li>
{% endfor %} 
</ul>