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
            }
        )

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

    Комментарии

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

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

    • Результат:50баллов,
    • Очки рейтинга-4
    m
    • molni99
    • 26 октября 2024 г. 8:37

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

    • Результат:80баллов,
    • Очки рейтинга4
    m
    • molni99
    • 26 октября 2024 г. 8:29

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

    • Результат:20баллов,
    • Очки рейтинга-10
    Последние комментарии
    ИМ
    Игорь Максимов22 ноября 2024 г. 19:51
    Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
    Evgenii Legotckoi
    Evgenii Legotckoi31 октября 2024 г. 21:37
    Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
    A
    ALO1ZE19 октября 2024 г. 15:19
    Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
    ИМ
    Игорь Максимов5 октября 2024 г. 14:51
    Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
    d
    dblas55 июля 2024 г. 18:02
    QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
    Сейчас обсуждают на форуме
    m
    moogo22 ноября 2024 г. 15:17
    Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
    Evgenii Legotckoi
    Evgenii Legotckoi24 июня 2024 г. 22:11
    добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
    t
    tonypeachey115 ноября 2024 г. 14:04
    google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
    NSProject
    NSProject4 июня 2022 г. 10:49
    Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

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