Python 3.7 / Django 2.2.1: проверьте поле перед сохранением - PullRequest
1 голос
/ 16 июня 2019

Цель состоит в том, чтобы пользователь мог сохранить модель маркировки только в том случае, если дата, которую он помещает, находится в диапазоне дат, от start_date до end_date, модели DateRange и если для поля включено значение True.

models.py:

class DateRange(models.Model):
class Meta:
    ordering = ['-first_date']

start_date = models.DateField(blank=False, null=True, verbose_name='Start Date')
end_date = models.DateField(blank=False, null=True, verbose_name='End Date')
enable = models.BooleanField(default=False, verbose_name='Enable')

def __str__(self):
    return '{} to {} is {}'.format(self.first_date, self.end_date, self.enable)


class Marking(models.Model):
class Meta:
    ordering = ['-first_date']

date = models.DateField(blank=False, null=True, verbose_name='Date')
order = models.BooleanField(default=False, verbose_name='Order')

def __str__(self):
    return '{} / {}'.format(self.date, self.order)

forms.py

class DateRangeForm(forms.ModelForm):
class Meta:
    model = DateRange
    fields = [
        'start_date',
        'end_date',
        'enable',
    ]


class MarkingForm(forms.ModelForm):
class Meta:
    model = Marking
    fields = [
        'date',
        'order',
    ]

views.py

def add_marking(request):
form = MarkingForm(request.POST or None, request.FILES or None)
if form.is_valid():
    instance = form.save(commit=False)
    instance.save()
    return HttpResponseRedirect(reverse("marking_info"))

context = {"form": form}

return render(request, 'add_marking.html', context)

Я пробовал несколько вариантов, но ни один из них не работал.Может ли кто-нибудь помочь мне на правильном пути?Спасибо!

1 Ответ

1 голос
/ 16 июня 2019

как, если положить чистый метод в примере моделей: models.py

class Marking(models.Model):

    date = models.DateField(blank=False, null=True, verbose_name='Date')
    order = models.BooleanField(default=False, verbose_name='Order')

    def clean(self):
        qs = DateRange.objects.filter(start_date__gte = self.date, end_date__lte = self.date, enable = True)
        if not qs:
            raise ValidationError('Measurement is outside the run')
...