BL4CK R4BBIT
BL4CK R4BBIT23 апреля 2021 г. 12:21

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

'''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

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

1
Evgenii Legotckoi
  • 2 июля 2021 г. 5:13

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

class EditMain(View):
    template_name = 'users/edit/main.html'
    title = _('Edit')

    def get(self, request):
        return render(
            request=request,
            template_name=self.template_name,
            context={
                'title': self.title,
                'user_form': forms.UserForm(instance=request.user),
                'profile_form': forms.ProfileForm(user=request.user, instance=request.user.profile)
            }
        )

    def post(self, request):
        user_form = forms.UserForm(data=request.POST, instance=request.user)
        profile_form = forms.ProfileForm(user=request.user, data=request.POST, files=request.FILES,
                                         instance=request.user.profile)

        if user_form.is_valid() and profile_form.is_valid():
            user_form.save()
            profile_form.save()
            return redirect(reverse('users:edit_main'))

        return render(
            request=request,
            template_name=self.template_name,
            context={
                'title': self.title,
                'user_form': user_form,
                'profile_form': profile_form
            }
        )

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

    Комментарии

    Только авторизованные пользователи могут публиковать комментарии.
    Пожалуйста, авторизуйтесь или зарегистрируйтесь
    Дмитрий

    C++ - Тест 004. Указатели, Массивы и Циклы

    • Результат:60баллов,
    • Очки рейтинга-1
    Дмитрий

    C++ - Тест 003. Условия и циклы

    • Результат:92баллов,
    • Очки рейтинга8
    d
    • dsfs
    • 26 апреля 2024 г. 4:56

    C++ - Тест 004. Указатели, Массивы и Циклы

    • Результат:80баллов,
    • Очки рейтинга4
    Последние комментарии
    k
    kmssr8 февраля 2024 г. 18:43
    Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
    АК
    Анатолий Кононенко5 февраля 2024 г. 1:50
    Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
    EVA
    EVA25 декабря 2023 г. 10:30
    Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
    J
    JonnyJo25 декабря 2023 г. 8:38
    Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
    G
    Gvozdik18 декабря 2023 г. 21:01
    Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
    Сейчас обсуждают на форуме
    G
    George137 мая 2024 г. 0:27
    добавить qlineseries в функции в функции: "GPlotter::addSeries(QString title, QVector &arr)" я вызываю метод setChart(...), я в конструктор передал адрес на QChartView элемент
    BlinCT
    BlinCT5 мая 2024 г. 5:46
    Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
    PS
    Peter Son3 мая 2024 г. 17:57
    Best Indian Food Restaurant In Cincinnati OH Ready to embark on a gastronomic journey like no other? Join us at App india restaurant and discover why we're renowned as the Best Indian Food Restaurant In Cincinnati OH . Whether y…
    Evgenii Legotckoi
    Evgenii Legotckoi2 мая 2024 г. 14:07
    Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.
    IscanderChe
    IscanderChe30 апреля 2024 г. 4:22
    Во Flask рендер шаблона не передаётся в браузер Доброе утро! Имеется вот такой шаблон: <!doctype html><html> <head> <title>{{ title }}</title> <link rel="stylesheet" href="{{ url_…

    Следите за нами в социальных сетях