在我的数据库中,我存储了一些错误,因此我可以轻松地在视图之间发送它们。这是我的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>
答案 0 :(得分:1)
您要分享的代码有很多话要说。
首先,我不确定为什么你真的需要一个具有这种结构的字典。你想要的输出是什么?
其次,这段代码很可疑:
for warning in warnings:
if Errors.objects.filter(status='1'):
....
status
是BooleanField
。你应该用布尔值过滤它。另一方面,为什么需要在迭代中过滤掉整个数据库?你的意思是这样吗?
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>