BL4CK R4BBIT
April 23, 2021, 10:21 p.m.

Валидация формы

  1. '''models.py'''
  2. class Meter(models.Model):
  3. TARIFF_CHOICES = (
  4. ('T1', 'Однотарифный'),
  5. ('T2', 'Двухтарифный'),
  6. ('T3', 'Трехтарифный'),
  7. )
  8. number_meter = models.CharField(max_length=20, unique=True, verbose_name='Номер счетчика')
  9. croft_meter = models.ForeignKey(Croft, on_delete=models.PROTECT, verbose_name='Участок')
  10. type_meter = models.ForeignKey(TypeMeter, on_delete=models.PROTECT, verbose_name='Тип счетчика')
  11. serial_number = models.CharField(max_length=20, blank=True, verbose_name='Серийный номер счетчика')
  12. seal_number = models.CharField(max_length=20, blank=True, verbose_name='Номер пломбы')
  13. date_meter = models.DateTimeField(default=datetime.now(), verbose_name='Дата установки')
  14. type = models.CharField(max_length=50, choices=TARIFF_CHOICES, verbose_name='Вид тарифа')
  15. last_reading_single = models.PositiveIntegerField(blank=True, null=True, verbose_name='Показания T1')
  16. last_reading_two = models.PositiveIntegerField(blank=True, null=True, verbose_name='Показания T2')
  17. last_reading_three = models.PositiveIntegerField(blank=True, null=True, verbose_name='Показания T3')
  18. is_active = models.BooleanField(default=True, verbose_name='Установлен')
  19.  
  20. def __str__(self):
  21. return self.number_meter
  22.  
  23. class Meta:
  24. verbose_name = 'Счетчик'
  25. verbose_name_plural = 'Счетчики'
  26. ordering = ['croft_meter']
  27.  
  28.  
  29. class Indication(models.Model):
  30. meter = models.ForeignKey(Meter, on_delete=models.PROTECT, verbose_name='Счетчик')
  31. reading_single = models.PositiveIntegerField(default=0, verbose_name='Показания T1')
  32. reading_two = models.PositiveIntegerField(default=0, blank=True, verbose_name='Показания T2')
  33. reading_three = models.PositiveIntegerField(default=0, blank=True, verbose_name='Показания T3')
  34. date_indication = models.DateTimeField(auto_now_add=True, verbose_name='Дата показаний')
  35. expenditure = models.PositiveIntegerField(default=0, verbose_name='Расход')
  36.  
  37. def __str__(self):
  38. return self.meter.number_meter
  39.  
  40. def save(self, *args, **kwargs):
  41. if not self.id:
  42. self.expenditure = self.reading_single - self.meter.last_reading_single
  43. self.meter.last_reading_single = self.reading_single
  44. self.meter.save()
  45. return super(Indication, self).save(*args, **kwargs)
  46.  
  47. class Meta:
  48. verbose_name = 'Показания'
  49. verbose_name_plural = 'Показания'
  50.  
  51.  
  52.  
  53. '''views.py'''
  54. class AddMeterView(SuccessMessageMixin, LoginRequiredMixin, CreateView):
  55. model = Meter
  56. template_name = 'crofts/add_meter.html'
  57. form_class = AddMeterForm
  58. success_url = reverse_lazy('main:meters_user')
  59.  
  60. def get(self, request=None, **kwargs):
  61. form = self.form_class()
  62. form.fields['croft_meter'].queryset = Croft.objects.filter(Q(owner=request.user) | Q(grower=request.user))
  63. return render(request, self.template_name, {'form': form})
  64.  
  65.  
  66. class AddIndicationView(SuccessMessageMixin, LoginRequiredMixin, CreateView):
  67. model = Indication
  68. template_name = 'main/profile/profile_meters/add_indication.html'
  69. form_class = AddIndicationForm
  70. success_url = reverse_lazy('main:meters_user')
  71.  
  72. def get(self, request=None, *args, **kwargs):
  73. form = self.form_class()
  74. form.fields['meter'].queryset = Meter.objects.filter(Q(croft_meter__owner=request.user) | Q(croft_meter__grower=request.user))
  75. return render(request, self.template_name, {'form': form})
  76.  
  77. '''forms.py'''
  78. class AddMeterForm(forms.ModelForm):
  79. last_reading_single = forms.IntegerField(label='Показания')
  80.  
  81. class Meta:
  82. model = Meter
  83. fields = ('number_meter', 'croft_meter', 'type_meter', 'serial_number', 'seal_number',
  84. 'date_meter', 'type', 'last_reading_single')
  85.  
  86.  
  87. class AddIndicationForm(forms.ModelForm):
  88. reading_single = forms.IntegerField(label='Показания')
  89.  
  90. class Meta:
  91. model = Indication
  92. fields = ('meter', 'reading_single')

Не могу проверить условие для формы
если reading_single < meter.last_reading_single

2

Do you like it? Share on social networks!

1
Evgenii Legotckoi
  • July 2, 2021, 3:13 p.m.

При работе с двумя формами в одном View я поступил так

  1. class EditMain(View):
  2. template_name = 'users/edit/main.html'
  3. title = _('Edit')
  4.  
  5. def get(self, request):
  6. return render(
  7. request=request,
  8. template_name=self.template_name,
  9. context={
  10. 'title': self.title,
  11. 'user_form': forms.UserForm(instance=request.user),
  12. 'profile_form': forms.ProfileForm(user=request.user, instance=request.user.profile)
  13. }
  14. )
  15.  
  16. def post(self, request):
  17. user_form = forms.UserForm(data=request.POST, instance=request.user)
  18. profile_form = forms.ProfileForm(user=request.user, data=request.POST, files=request.FILES,
  19. instance=request.user.profile)
  20.  
  21. if user_form.is_valid() and profile_form.is_valid():
  22. user_form.save()
  23. profile_form.save()
  24. return redirect(reverse('users:edit_main'))
  25.  
  26. return render(
  27. request=request,
  28. template_name=self.template_name,
  29. context={
  30. 'title': self.title,
  31. 'user_form': user_form,
  32. 'profile_form': profile_form
  33. }
  34. )

Уже в методе, где проходит валидация обеих форм, можно провести проверки условий между двумя формами.

    Comments

    Only authorized users can post comments.
    Please, Log in or Sign up
    • Last comments
    • AK
      April 1, 2025, 11:41 a.m.
      Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
    • Evgenii Legotckoi
      March 9, 2025, 9:02 p.m.
      К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
    • VP
      March 9, 2025, 4:14 p.m.
      Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
    • ИМ
      Nov. 22, 2024, 9:51 p.m.
      Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
    • Evgenii Legotckoi
      Oct. 31, 2024, 11:37 p.m.
      Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup