Джанго - как сохранить форму с несколькими объектами? - PullRequest
0 голосов
/ 04 июля 2019

Я использую Python3.7, Django 2.2.

Ниже вы можете найти мой код, чтобы лучше понять мою проблему.

Как вы можете видеть мой код ниже, я создал таблицу с некоторыми записями. Пропустите польское имя значений в models.py. Мы должны сосредоточиться только на manager_accpt. Это значение имеет 2 аргумента (проверьте файл choices.py).

Когда я создаю представление с помощью def manager_day_free_accpt, я получаю несколько объектов. Последний столбец содержит выбор, который мой пользователь должен выбрать и сохранить. Пример, который я привел на экране ниже. В чем моя проблема Я должен сделать это двумя способами, потому что пользователь сам выберет, какое решение более удобно для них :) У меня проблема с кнопками, куда их поставить? Потому что сейчас субмиссия изменяет целые объекты, но с неправильными значениями.

Когда я помещаю Кнопки снаружи "для цикла", ничего не происходит с объектами. Можете ли вы помочь мне, я должен найти два решения для этого:

первый: Каждая строка должна содержать зеленую кнопку с подтверждением и отклонением (белая кнопка). И когда пользователь нажимает зеленую кнопку, значение только в этом необработанном тексте должно обновлять объекты в БД.

2-й соль: Пользователь выбирает принять и отклонить в каждой строке. После этого пользователь должен нажать кнопку подтверждения, и все изменения должны обновить объекты в БД.

models.py

class Wniosek_urlop(models.Model):
    data_zloz_wniosku = models.DateTimeField(auto_now_add=True, null=True)
    data_start_urlop = models.DateField('Urlop od', blank=False, null=True)
    data_end_urlop = models.DateField('Urlop do', blank=False,null=True)
    #Representant - osoba zastepująca w tym czasie nieobecnego pracownika.
    representant = models.CharField('Zastępca', max_length=50, null=False,blank=False,
                                    help_text="Podaj imie i nazwisko osoby zastępującej Cię w czasie nieobecności. To pole będzie widoczne przez kierownika")
    reason = models.TextField('Uzasadnienie', max_length=255, blank=False, null=False, help_text="Powód złożenia wniosku", error_messages={'blank': "Wpisz tutaj coś"})
    note_optional = models.TextField('Uwagi', max_length=255, null=True, blank=True)
    urlop = models.CharField('Urlop', choices=urlop_ch, default=1, max_length=50)
    manager = models.CharField('Przełożony', choices=manager_ch, default=0, max_length=50)
    manager_accpt = models.CharField('Akceptacja', choices=accpt_ch, null=True, blank=True, max_length=25)
    worker = models.ForeignKey(Lista, on_delete=models.CASCADE, null=True, blank=True)

views.py

def manager_day_free_accpt(request):
    db_all_free_days = Wniosek_urlop.objects.all().order_by('id')

    #Pole wyboru y_n
    form_accpt = Manager_accpt_y_n(request.POST or None)
    if form_accpt.is_valid():
        form_accpt.save()
        messages.success(request, 'Zapisano zmiany.')
    else:
        messages.success(request, 'Ups. Cos poszło nie tak.')

    return render(request, "manager_accpt.html", {'db_all_free_days': db_all_free_days, 'form_accpt': form_accpt})

choices.py

manager_ch = [("1", "manager 1"),
              ("2", "manager 2")
               ]

accpt_ch = [
    ("1", "accept"),
    ("2", "reject")
]

manager_accpt.html

<table class="table">
  <thead>
    <tr>
      <th scope="col">#</th>
      <th scope="col">Pracownik</th>
      <!--Skip some col-->
      <th scope="col">Przełożony</th>
      <th scope="col"></th>
    </tr>
  </thead>
  <tbody>


  {% for tmp in db_all_free_days %}
    {%if tmp.manager_accpt == null %}
    <tr>
      <th scope="row">{{tmp.id}}</th>
      <td>{{tmp.worker}}</td>
      <td>{{tmp.manager}}</td>
      <td>
          <form role="form">

            {% csrf_token %}
            {{form_accpt|bootstrap}}
<button type="submit" class="btn btn-success">Wyślij wniosek&nbsp<i class="far fa-save"></i></button>
  <button type="button" class="btn btn-outline-secondary" onclick="goBack()">Cofnij</button>
          </form>
      </td>
    </tr>
    {% else %}
    <div class="alert alert-dark" role="alert">
  No free days to accept
    </div>
  {% endif %}
  {% endfor %}

Экран - результат на странице: enter image description here

...