【问题标题】:Django 'model' object is not iterableDjango“模型”对象不可迭代
【发布时间】:2019-10-15 21:39:47
【问题描述】:

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

为此,我将 id 传递给视图,以便它可以获取相应用户的详细信息并显示给我。一切正常,直到错误发生object is not iterable。这是我的代码

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)

我想根据他们所做的流程查看每个用户的数据。

【问题讨论】:

    标签: django django-models django-views


    【解决方案1】:

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

    filter() 总是会给你一个 QuerySet”——它是可迭代的

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

    【讨论】:

      【解决方案2】:

      您正在将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)来避免异常。

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

      为了更好的使用,可以在查询时使用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 %}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-09
        • 2021-12-09
        • 1970-01-01
        • 2012-08-10
        • 2021-07-04
        • 2021-02-04
        • 2020-02-28
        相关资源
        最近更新 更多