Отобразите набор данных Django в формате таблицы HTML на веб-странице, а также используйте его для ввода по запросу. - PullRequest
0 голосов
/ 03 февраля 2020

Снимок экрана приложения У меня есть следующая Django Модель для системы подачи заявления сотрудника. Сотрудники предоставляют данные по всем полям, кроме последнего - оставьте_сечение. Входные данные для решения об отпуске поступают от менеджера сотрудника.

Models.py

class LeaveTransactionLog(models.Model):
    empno = models.ForeignKey(Employee,related_name='ltl_empno',on_delete=models.PROTECT)
    approver_mgrno = models.IntegerField(default=0)
    applied_year = models.IntegerField(default=2019)
    applied_date = models.DateTimeField(auto_now_add=True)
    leave_type = models.CharField(max_length=2,choices=leave_choices,default='PL')
    leave_start_date = models.DateField()
    leave_end_date = models.DateField()
    leave_days = models.IntegerField(default=0)
    leave_decision = models.CharField(max_length=2,choices=decision_choices,default='ES')

Я пытаюсь создать форму Django, которая будет отображать все листы, ожидающие одобрения для конкретного менеджера. Поскольку я хочу, чтобы менеджер видел все строки, ожидающие его одобрения одновременно, отображение построено с использованием таблицы HTML следующим образом.

Файл шаблона

{% extends 'base.html' %}

{% block title %} Approve/Reject/Escalate Employee Leave Applications {% endblock %}

{% block body %}
  <h2 align="center"> Approve/Reject/Escalate Employee Leave Applications </h2>
  <a href = "{% url 'home' %}" class="home_from_ApproveLeaves"> Back To Homepage </a>

{% block content %}
    <form action="{% url 'ApproveRejectEscalateForm' %}" method="post" novalidate>
    {% csrf_token %}
    <table class="LeaveTable" align="center">
      <thead class="LeaveTableHead">
        <tr>
          <th> Employee Number </th>
          <th> Employee Name </th>
          <th> Deptno </th>
          <th> Department Name </th>
          <th> Leave Type </th>
          <th> Start Date </th>
          <th> End Date </th>
          <th> # of days </th>
          <th> Applied on Date </th>
          <th> Approving MgrNo </th>
          <th> Decision </th>
        </tr>
      </thead>
     <tbody>
      {% for lev in leaves %}
        <tr>
          <td name="empno"> {{lev.empno}} </td>
          <td> Employee Name </td>
          <td> Deptno </td>
          <td> Dept Name </td>
          <td name="leave_type"> {{lev.leave_type}} </td>
          <td name="lsd"> {{lev.leave_start_date}} </td>
          <td name="led"> {{lev.leave_end_date}} </td>
          <td name="ld"> {{lev.leave_days}} </td>
          <td name="lad"> {{lev.applied_date}} </td>
          <td name="lam"> {{lev.approver_mgrno}} </td>
          <td name="leave_descision"> 
          <input type="hidden" name="decision_choice">
             <select>
               <option value="AP"> Approve Leave </option>
               <option value="ES"> Escalate Leave </option>
               <option value="RJ"> Reject Leave </option>
             </select>
             </input>
          </td>
        </tr>
        {% endfor %}
     </tbody>
     <input type="submit" value="Submit" />
    </table>
    </form>
{% endblock %}
{% endblock %}

Views.py

Следующее представление визуализирует исходную форму с помощью метода get () ClassBasedView. Метод Post пытается прочитать все значения, отображаемые в форме, которые были взяты из базы данных, кроме одного поля (exit_decision), которое будет введено менеджером сотрудника.

class ApproveRejectEscalateFormView(View):

    def get(self, request):
        leaves_formset = modelformset_factory(LeaveTransactionLog,fields=('empno','approver_mgrno','applied_year','leave_type','leave_start_date','leave_end_date','leave_days','leave_decision'))
        leaves_formset = ApproveRejectEscalateForm(data=LeaveTransactionLog.objects.all())
        leaves = LeaveTransactionLog.objects.all()
        return render(request,'ApproveRejectEscalateForm.html',{'leaves':leaves,'form':leaves_formset})

    def post(self,request):
        responseformset = ApproveRejectEscalateForm(request.POST)
        if responseformset.is_valid():
           print('Form valid !')
           formdata = responseformset.cleaned_data
           iteration = 1
           for f in responseformset:
               print('Employee details :',iteration)
               print('Employee number :',formdata.empno)
               iteration = iteration + 1
        else:
            print('Form Invalid !')
            print(responseformset.errors)
            print(responseformset.non_field_errors())
        return render(request, 'LeaveApplicationhome.html')

** Однако когда Форма отправлена ​​is_valid () всегда возвращает отрицательный. Причина в том, что форма представляется пустой. Form.errors () показывает это ...

Форма недействительна!

empno Это поле обязательно для заполнения. Approver_mgrno Это поле необходимо заполнить d. apply_year Это поле необходимо заполнить d. оставлять_тип Это поле обязательно к заполнению. листьями_старт_даты Это поле является обязательным для заполнения. листьями_данных_дата Это поле необходимо заполнить. листьями_дней Это поле является обязательным для заполнения. листьями_разрешением Это поле обязательно для заполнения.

**

Причина в том, что данные в пределах HTML теги не отправляются на POST. Это известно. Этот тег также использовался с опцией «hidden», предоставляя набор данных как {{left.empno}} и т. Д. Кроме того, пробовал метод formsets, но безуспешно. form.as_table тоже не сработало.

Вопрос в том, как мне отобразить Django данные модели в настроенном табличном формате HTML с одним полем в строке, запрашивающим ввод, и я должен иметь возможность обрабатывать все значения полей после POST.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...