Python 3.7 / Django 2.2.1:保存前检查字段

Posted

技术标签:

【中文标题】Python 3.7 / Django 2.2.1:保存前检查字段【英文标题】:Python 3.7 / Django 2.2.1: Check field before save 【发布时间】:2019-06-16 12:19:55 【问题描述】:

目标是用户只有在他输入的日期在 DateRange 模型的日期范围 start_date 到 end_date 并且字段 enable 为 True 时才能保存 Marking 模型。

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】:

如果在模型中放置干净的方法 例子: 模型.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')

【讨论】:

谢谢!我试了一下,效果很好!唯一的变化是 _gte 和 _lte。

以上是关于Python 3.7 / Django 2.2.1:保存前检查字段的主要内容,如果未能解决你的问题,请参考以下文章

django_background_tasks 是不是支持 django 3 和 python 3.7?

django升级2.1python升级3.7时出现的错误:"trying to load '%s': %s" % (entry[1], e) django.temp

阿里云CentOS8.0服务器配置Django3.0+Python 3.7 环境

加载 MySQLdb 模块时出错 - Windows 上的 Python 3.7

1-Django2.2安装指南

Django 1.8 和 Rest Framework 3.7 的“导入错误:没有名为 urls 的模块”