Django 'модель' объект не повторяется - PullRequest
0 голосов
/ 30 мая 2019

Этот вопрос может быть задан где-то еще, но я не смог найти ответ на него.

У меня есть таблица, в которой показаны зарегистрированные сотрудники.Я хочу сгенерировать простую 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)

Я хочу видеть данные каждого отдельного пользователя в соответствии с процессом, который они сделали.Спасибо

Ответы [ 2 ]

3 голосов
/ 30 мая 2019

Измените Employee.objects.get(id=id) на Employee.objects.filter(id=id)

"filter () всегда даст вам QuerySet" - он повторяется

get () - возвращает один объект и не повторяется

1 голос
/ 30 мая 2019

Вы перебираете 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 %}
...