Как обновить другое поле модели из updateview - PullRequest
0 голосов
/ 11 апреля 2019

Как я могу использовать текущее значение поля в окне обновления для обновления другого поля?

У меня есть модель сотрудника. У него есть поля day_absent и amount_absent, которые показывают общую сумму вычетов на основе количества day_absent.

В режиме обновления можно установить day_absent. Когда я могу вернуться к DetailView, скажем, что day_absent равен 1., но вычет по-прежнему равен 0. Я понимаю, что это потому, что до сохранения (), day_absent был по-прежнему 0 и был изменен на 1. Так что вопрос в том, как я могу вычислить Какое значение вводится в day_absent до его сохранения?

class PayrollTransactionUpdate(LoginRequiredMixin,UpdateView):
    model = t_pay
    template_name = 'payroll/transaction/update.html'
    fields = ['day_absent']


  def post(self,request,pk):
        emp = t_pay.objects.get(pk=pk)
        emp.amt_absent = emp.day_absent * emp.amt_rate
        emp.save()
        return super().post(request)

1 Ответ

1 голос
/ 11 апреля 2019

UpdateView сохраняет объект в методе form_valid(). Посмотрите на этот бесценный сайт , когда вы используете представления на основе классов Django.

Поэтому вы должны переопределить метод form_valid(), а не метод post():

def form_valid(self, form):
    emp = form.save(commit=False)
    emp.amt_absent = emp.day_absent * emp.amt_rate
    emp.save()
    self.object = amp
    return super().form_valid(form)

Обратите внимание, что сохранение поля в Employee, которое можно легко рассчитать из двух других полей, не рекомендуется, так как это может привести к несогласованности / повреждению данных. Поскольку amt_absent - это просто умножение двух других полей, зачем вам его сохранять?

В качестве альтернативы, если смотреть на то, что ты на самом деле делаешь, это не кажется ответственностью видения. Если это должно происходить каждый раз при сохранении Employee, вы можете сделать это на самой модели:

class Employee(Model):
    ... # fields go here

    def save(self, **kwargs):
        self.amt_absent = self._get_amt_absent()
        super().save(**kwargs)
        # update other models here as well

В этой ситуации вам не нужно ничего переопределять на UpdateView.

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