При методе form.save() все непереданные в форме поля перезаписываются пустыми значениями
я новенькая в django, буду только рада, если укажете на "плохие практики" в коде.
Суть вопроса следующая: есть модель, в ней пусть 10 полей, в форме я хочу обновить значение пусть трёх из них, при методе save.form() эти три записываются данными из формы, остальные 7 перезаписываются пустотой.
Как обновить данные модели, избежав перезаписывания непереданных полей?
models.py:
class Users(models.Model):
name = models.CharField("Имя", max_length=100)
company = models.CharField("Компания", max_length=100, blank = True, null=True)
anketa = models.CharField("Анкета", max_length=100, blank = True, null=True)
listPhone = models.CharField("Список обзвона", max_length=100, blank = True, null=True)
datePhone = models.CharField("Дата звонка", max_length=100, blank = True, null=True)
timePhone = models.CharField("Время звонка", max_length=100, blank = True, null=True)
timesPhone = models.CharField("Длительность звонка (в минутах)", max_length=100, blank = True, null=True)
lucky = models.CharField("Звонок успешен", max_length=100, blank = True, null=True)
partyID = models.CharField("Код каталога", max_length=100, null=True, blank = True)
description = models.TextField("Описание (Вы купили)", blank = True, null=True)
facture = models.CharField("Фактура", max_length=200, blank = True, null=True)
factureDate = models.CharField("Дата фактуры", max_length=100, blank = True, null=True)
phone = models.CharField("Телефон", max_length=100, blank = True, null=True)
phoneCompany = models.CharField("Телефон Организации", max_length=100, blank = True, null=True)
phoneMobile = models.CharField("Мобильный Телефон", max_length=100, blank = True, null=True)
mail = models.EmailField()
loadDate = models.DateField("Дата загрузки", default=date.today)
url = models.SlugField(max_length=130, unique=True, blank = True)
title = models.ForeignKey(
Questions, verbose_name="Тема опроса", on_delete=models.SET_NULL, null=True, blank = True
)
rating1 = models.PositiveIntegerField("Ответ 1", blank = True, null=True)
unswer1 = models.TextField("Примечание 1", blank = True, null=True)
rating2 = models.PositiveIntegerField("Ответ 2", blank = True, null=True)
unswer2 = models.TextField("Примечание 2", blank = True, null=True)
rating3 = models.PositiveIntegerField("Ответ 3", blank = True, null=True)
unswer3 = models.TextField("Примечание 3", blank = True, null=True)
rating4 = models.PositiveIntegerField("Ответ 4", blank = True, null=True)
unswer4 = models.TextField("Примечание 4", blank = True, null=True)
rating5 = models.PositiveIntegerField("Ответ 5", blank = True, null=True)
unswer5 = models.TextField("Примечание 5", blank = True, null=True)
rating6 = models.PositiveIntegerField("Ответ 6", blank = True, null=True)
unswer6 = models.TextField("Примечание 6", blank = True, null=True)
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse("individualurl", kwargs={"slug": self.url})
class Meta:
verbose_name = "Клиент"
verbose_name_plural = "Клиенты"
фрагмент views.py:
class addUnswer(View):
def post(self, request, pk):
form = UsersForm(request.POST)
if form.is_valid():
form = form.save(commit=False)
form.id = pk
form.save()
return redirect("/")
forms.py: (на одном из форумов видела, что если передать в fields поля, которые впоследствии не будут передаваться через форму, то они не подвергнутся изменению, но у меня в таком случае вообще ничего не меняется)
class UsersForm(ModelForm):
class Meta:
model = Users
fields = ['unswer1', 'unswer2', 'unswer3', 'unswer4', 'unswer5', 'unswer6',]
Если это важно, ссылка по которой находится форма уникальна для каждого объекта user по полю url
В urls.py это выглядит так:
path("<slug:slug>/", views.UsersDetailView.as_view(), name="user_detail")
User в админ-панели до метода form.save():

передаваемые данные:
После вызова метода form.save():

Буду рада любому совету и варианту решения проблемы.
Сегодня была предпринята попытка использовать метод UpdateViev:
class addUnswer(UpdateView):
def post(self, request, pk):
model = Users
form_class = UsersForm
template_name = "polls/polls.html"
return redirect("/")
Значения передаются, ошибок нет, но ничего не записывается и не обновляется.
Ответы (1 шт):
Необходимо передавать instance, который принимает необходимый объект вашей модели, тогда за основу будут браться именно эти значения.
вот решение:
class addUnswer(View):
def post(self, request, pk):
form = UsersForm(request.POST, instance=Users.objects.get(pk=pk))
if form.is_valid():
form.save()
return redirect("/")
