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
  • 02 липня 2021 р. 05: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
            }
        )

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

    Коментарі

    Only authorized users can post comments.
    Please, Log in or Sign up
    AD

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

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

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

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

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

    • Результат:20бали,
    • Рейтинг балів-10
    Останні коментарі
    ИМ
    Игорь Максимов22 листопада 2024 р. 11:51
    Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
    Evgenii Legotckoi
    Evgenii Legotckoi31 жовтня 2024 р. 14:37
    Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
    A
    ALO1ZE19 жовтня 2024 р. 08:19
    Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
    ИМ
    Игорь Максимов05 жовтня 2024 р. 07:51
    Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
    d
    dblas505 липня 2024 р. 11:02
    QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
    Тепер обговоріть на форумі
    Evgenii Legotckoi
    Evgenii Legotckoi24 червня 2024 р. 15:11
    добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
    t
    tonypeachey115 листопада 2024 р. 06:04
    google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
    NSProject
    NSProject04 червня 2022 р. 03:49
    Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
    9
    9Anonim25 жовтня 2024 р. 09:10
    Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

    Слідкуйте за нами в соціальних мережах