Тестирование представления обновления: как передать данные об изменении значения в представлении обновления с формой?
Я пытаюсь написать тесткейс для одного из моих представлений, которое использует форму. views.py
def parametrage(request,pk):
parametrage = get_object_or_404(Parametrage, asp_par_cle = pk)
form = ParametrageForm(request, data=request.POST or None, instance = parametrage)
print('form.data',form.data)
if form.is_valid():
parametrage = form.save()
parametrage.opr_nom = request.user.username
parametrage.opr_dat = timezone.now()
form.save()
return redirect('pharmacy:dashboard')
return render(request, 'pharmacy/parametrage.html', {'form': form})
tests.py
class PharmacyParametrageTestCase(TestCase):
def setUp(self):
Parametrage.objects.create(asp_par_loc='TR',asp_par_ale=1,asp_par_con=8)
def test_email_alert(self):
instance = Parametrage.objects.get(asp_par_cle=1)
data = json.dumps({"asp_par_ale":2,})
response = self.client.post(reverse('pharmacy:parametrage', kwargs={'pk':1}),instance=instance, data=data, follow=True, content_type='application/json')
self.assertEqual(response.status_code,200)
self.assertEqual(Parametrage.objects.get(asp_par_cle=1).asp_par_ale,2)
Второй assert не сработал, потому что экземпляр Parametrage не обновлен. form.is_valid() возвращает False, а form.errors не возвращает никакой ошибки. form.data пуст
Очевидно, что я никогда не изменяю значение asp_par_ale, но не знаю, как это сделать в тестах. Я пытаюсь передавать данные, но не получается. буду признателен за помощь
i found i guess, when you said, object is not updated, you spoke only about opr_dat and opr_dat ? Вы дважды вызвали form.save(). Вам нужно вызвать функцию сохранения isntance :
def parametrage(request,pk):
parametrage = get_object_or_404(Parametrage, asp_par_cle = pk)
form = ParametrageForm(request, data=request.POST or None, instance = parametrage)
print('form.data',form.data)
if form.is_valid():
parametrage = form.save(commit=False)
parametrage.opr_nom = request.user.username
parametrage.opr_dat = timezone.now()
parametrage.save()
return redirect('pharmacy:dashboard')
return render(request, 'pharmacy/parametrage.html', {'form': form})