У меня есть таблица, которая показывает мне зарегистрированных сотрудников. Я хочу создать простую HTML-страницу в соответствии с их БД, которая включает их имя, идентификатор, обозначение и т. д.
Для этого я передаю идентификатор в представление, чтобы оно могло получить данные соответствующего пользователя и показать мне. Все работает нормально, пока не возникает ошибка объект не является итерируемым. Вот мой код
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)
Я хочу видеть данные каждого отдельного пользователя в соответствии с процессом, который они сделали.
Изменить Employee.objects.get(id=id)
на Employee.objects.filter(id=id)
«filter()
всегда будет давать вам QuerySet» — это итерация
get()
- вернуть один объект, и он не может быть итерирован
Вы перебираете 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 %}