【问题标题】:Storing objects into dictionary in Django在Django中将对象存储到字典中
【发布时间】:2016-07-30 19:28:01
【问题描述】:

在我的数据库中,我存储了一些错误,因此我可以轻松地在视图之间发送它们。这是我的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 中请求代码是一个禁忌,因此只有愿意分享一些有用网站或示例的任何人都可以选择)。

下面的示例(正如我现在使用的那样)根本不打印任何内容。

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

【问题讨论】:

    标签: python html django


    【解决方案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>
    

    【讨论】:

    • 很多你提到的东西让我想到了我的代码。我修复了大部分问题,但仍然没有数据发送到该站点。我检查了来源,这些数据应该在哪里是空白的。否则在这种情况下,我使用的是 BooleanField,所以当你纠正我时,我可以使用“warning.status”,但是如果使用 Charfield 并且我想基于它进行迭代呢?例如: if (warning.error_message__startswith='Device') .. 这是一个好的 if 语句吗?
    • if warning.error_message.startswith('Device'): 可以。或者您可以首先将它们过滤掉:Error.objects.filter(error_message__startswith='Device')。或者在您的情况下:Error.objects.filter(status=True)。顺便说一句,尝试改用err.items。这是 Django 模板语法,而不是 Python。
    • 好的,谢谢,我会相应地调整我的代码。不幸的是err.items 没有解决这个问题。有什么建议我该如何调试? (数据库中恰好有 1 行满足这个条件 atm,所以我确定应该输出一些东西)。
    • 你的问题是这一行:return render(request, "index.html", err)。应该是这样的:return render(request, "index.html", {'err': err})
    • 我认为我需要通过字典。 Err 是一个字典,所以它应该可以工作。我按照你的说法试过了,但也没有解决:( .
    猜你喜欢
    • 2018-08-23
    • 2022-01-09
    • 1970-01-01
    • 2014-08-11
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    相关资源
    最近更新 更多