Валидация формы
- '''models.py'''
- class Meter(models.Model):
- TARIFF_CHOICES = (
- ('T1', 'Однотарифный'),
- ('T2', 'Двухтарифный'),
- ('T3', 'Трехтарифный'),
- )
- number_meter = models.CharField(max_length=20, unique=True, verbose_name='Номер счетчика')
- croft_meter = models.ForeignKey(Croft, on_delete=models.PROTECT, verbose_name='Участок')
- type_meter = models.ForeignKey(TypeMeter, on_delete=models.PROTECT, verbose_name='Тип счетчика')
- serial_number = models.CharField(max_length=20, blank=True, verbose_name='Серийный номер счетчика')
- seal_number = models.CharField(max_length=20, blank=True, verbose_name='Номер пломбы')
- date_meter = models.DateTimeField(default=datetime.now(), verbose_name='Дата установки')
- type = models.CharField(max_length=50, choices=TARIFF_CHOICES, verbose_name='Вид тарифа')
- last_reading_single = models.PositiveIntegerField(blank=True, null=True, verbose_name='Показания T1')
- last_reading_two = models.PositiveIntegerField(blank=True, null=True, verbose_name='Показания T2')
- last_reading_three = models.PositiveIntegerField(blank=True, null=True, verbose_name='Показания T3')
- is_active = models.BooleanField(default=True, verbose_name='Установлен')
- def __str__(self):
- return self.number_meter
- class Meta:
- verbose_name = 'Счетчик'
- verbose_name_plural = 'Счетчики'
- ordering = ['croft_meter']
- class Indication(models.Model):
- meter = models.ForeignKey(Meter, on_delete=models.PROTECT, verbose_name='Счетчик')
- reading_single = models.PositiveIntegerField(default=0, verbose_name='Показания T1')
- reading_two = models.PositiveIntegerField(default=0, blank=True, verbose_name='Показания T2')
- reading_three = models.PositiveIntegerField(default=0, blank=True, verbose_name='Показания T3')
- date_indication = models.DateTimeField(auto_now_add=True, verbose_name='Дата показаний')
- expenditure = models.PositiveIntegerField(default=0, verbose_name='Расход')
- def __str__(self):
- return self.meter.number_meter
- def save(self, *args, **kwargs):
- if not self.id:
- self.expenditure = self.reading_single - self.meter.last_reading_single
- self.meter.last_reading_single = self.reading_single
- self.meter.save()
- return super(Indication, self).save(*args, **kwargs)
- class Meta:
- verbose_name = 'Показания'
- verbose_name_plural = 'Показания'
- '''views.py'''
- class AddMeterView(SuccessMessageMixin, LoginRequiredMixin, CreateView):
- model = Meter
- template_name = 'crofts/add_meter.html'
- form_class = AddMeterForm
- success_url = reverse_lazy('main:meters_user')
- def get(self, request=None, **kwargs):
- form = self.form_class()
- form.fields['croft_meter'].queryset = Croft.objects.filter(Q(owner=request.user) | Q(grower=request.user))
- return render(request, self.template_name, {'form': form})
- class AddIndicationView(SuccessMessageMixin, LoginRequiredMixin, CreateView):
- model = Indication
- template_name = 'main/profile/profile_meters/add_indication.html'
- form_class = AddIndicationForm
- success_url = reverse_lazy('main:meters_user')
- def get(self, request=None, *args, **kwargs):
- form = self.form_class()
- form.fields['meter'].queryset = Meter.objects.filter(Q(croft_meter__owner=request.user) | Q(croft_meter__grower=request.user))
- return render(request, self.template_name, {'form': form})
- '''forms.py'''
- class AddMeterForm(forms.ModelForm):
- last_reading_single = forms.IntegerField(label='Показания')
- class Meta:
- model = Meter
- fields = ('number_meter', 'croft_meter', 'type_meter', 'serial_number', 'seal_number',
- 'date_meter', 'type', 'last_reading_single')
- class AddIndicationForm(forms.ModelForm):
- reading_single = forms.IntegerField(label='Показания')
- class Meta:
- model = Indication
- fields = ('meter', 'reading_single')
Не могу проверить условие для формы
если reading_single < meter.last_reading_single
2
100
Do you like it? Share on social networks!
- Last comments
- AKApril 1, 2025, 11:41 a.m.Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
- VPMarch 9, 2025, 4:14 p.m.Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
- ИМNov. 22, 2024, 9:51 p.m.Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
- Now discuss on the forum
- МАApril 1, 2025, 4:21 p.m.0ff763fe-4e50-455d-a3a6-5699c243b1a5_17_44_22_1.xml
- fFeb. 15, 2025, 1:46 p.m.Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
- Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
- Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
При работе с двумя формами в одном View я поступил так
Уже в методе, где проходит валидация обеих форм, можно провести проверки условий между двумя формами.