Django. Запись формы с привязкой экземпляра модели
При записи формы с привязанным экземпляром модели instance происходит обнуление значений полей сущности, которые не были в составе формы и, соответственно, не пришли в POST-запросе, но присутствовали в instance на момент инициализации.
Вводить данные в форму могут пользователи: Операторы - поля name, number, ОТК - поле allow и Менеджеры - все поля формы модели. Как видим, для Оператора и ОТК в форме присутствует только часть полей (наличие полей ограничено средствами html-шаблона). Но, когда Оператор или ОТК редактируют форму с экземпляром модели instance со всеми инициализированными данными, значения остальных полей - allow, date иtime, кроме файлового поля ticket обнуляются при записи формы, хотя присутствуют в instance.
В связи этим вопросы:
- Нормально ли такое поведение формы с
instanceстирать содержимое полей, не участвующих в POST? - Как в данном случае обойти проблему потери информации и обеспечить возможность частичного и полного редактирования формы с сохранением остальных данных.
- Возможно, существуют общепринятые подходы к решению такой стандартной ситуации, подскажите, плиз..?
Модель:
class Entry(models.Model):
# поля Оператора
name = models.CharField(max_length=20, blank=True)
number = odels.CharField(max_length=10, blank=True)
# поле ОТК
allow = models.NullBooleanField(default=None, choices=((None, 'Нет'), (True, 'Да'), (False, 'Отказ')))
# поля Менеджера + все вышеуказанные
date = models.DateField(blank=True, null=True)
time = models.TimeField(blank=True, null=True)
ticket = models.FileField(blank=True, null=True, upload_to='tickets/')
Форма:
class Form(forms.ModelForm):
class Meta:
model = Entry
fields = ['name', 'number', 'allow', 'date', 'time', 'ticket']
View:
def edit_form(request, pk=None):
staff = request.user.staff
entry = Entry.objects.filter(id=pk).first()
entryForm = Form(request.POST or None, request.FILES or None, instance = entry)
if request.method == "POST" and entryForm.is_valid():
entryForm.save()
redirect(search_entry(request))
else:
render(request, 'template.html', {'entryForm': entryForm, 'staff': staff})
HTML-шаблон:
<div class="form-control">
{%for field in entryForm %}
{%if staff.is_operator and forloop.counter < 3 or staff.is_otk and forloop.counter == 3 or staff.is_manager%}
<label>{{field.label_tag}}</label>
<p>{{field}}</p>
{%endif%}
{%endfor%}
</div>