Django“模型”对象不可迭代

时间:2019-05-30 08:47:46

标签: django django-models django-views

这个问题可能在其他地方被问到,但是我找不到答案。

我有一张桌子,向我显示已注册的员工。我想根据他们的数据库生成一个简单的HTML页面,其中包括他们的名称,ID,名称等。

为此,我向视图传递了一个id,以便它可以获取相应用户的详细信息并显示给我。一切正常,直到发生错误对象不可迭代为止。这是我的代码

report.html


{% if emp_item %}
 {% for some in emp_item %}
    <title> {{ some.employee_name }} Report</title>

    <h3>{{ some.employee_name }}</h3>

    <table style="width:30%" border="4">


        <td>{{some.id}}</td>
        <td>{{some.Annual_leave}} </td>
        <td>{{some.Sick_leave}} </td>
        <td>{{some.allowed}} </td>

        </table>

{% endfor %}

<h2>No User</h2>
{% else %}
{% endif %}

view.py


@staff_member_required  # for admin login required
def report(request, id):
    emp_item = Employee.objects.get(id=id)
    context = {'emp_item': emp_item}
    return render(request, 'projectfiles/report.html', context)

urls.py



    url(r'^(?i)Rejectleaves/$', views.rejected_leave_show,
        name='Reject_show'),  # user leaves

    url(r'^(?i)report/(?P<id>\d+)$', views.report,
        name='Report'),  # user Report

models.py



class Employee(models.Model):

    allowed = models.BooleanField(default=True)
    employee_name = models.OneToOneField(User, on_delete = models.CASCADE)
    employee_designation = models.CharField(max_length = 5)
    employee_department = models.CharField(max_length = 5)
    Annual_leave = models.PositiveSmallIntegerField(default=5)
    Sick_leave = models.PositiveSmallIntegerField(default=5)

我希望能够根据他们进行的处理来查看每个用户的数据。 谢谢

2 个答案:

答案 0 :(得分:3)

Employee.objects.get(id=id)更改为Employee.objects.filter(id=id)

“ filter()始终会为您提供QuerySet”-可迭代

get()-返回单个对象,并且该对象不可迭代

答案 1 :(得分:1)

您正在遍历emp_item作为对象列表。但这是一个对象,因为 Employee.objects.get(id = id)返回单个对象而不是查询集。

因此,您需要做的是从模板中删除for-loop,如下:

{% if emp_item %}
    <title> {{ emp_item.employee_name }} Report</title>

    <h3>{{ emp_item.employee_name }}</h3>
    ...and so on
{% else %}
<h2>No User</h2>
{% endif %}

但是,如果在查询时使用get,则更有可能获得DoesNotExist的异常。因此,最好使用 Employee.objects.filter(id = id)来避免任何异常。

如果您使用{% if emp_item %}进行查询,则模板中的get毫无用处。

为了更好地使用,您可以在查询时使用get,如果发生异常,则可以向模板发送消息。例如:

def report(request, id):
    try:
        emp_item = Employee.objects.get(id=id)
        return render(request, 'projectfiles/report.html', {'emp_item':emp_item})
    except Employee.DoesNotExist:
        return render(request, 'projectfiles/report.html', {'error': 'No data found.'})

然后进入模板:

{% if error %}
    {{ error }}
{% else %}
    <title> {{ emp_item.employee_name }} Report</title>
    .... and so on to display other data
{% endif %}