【问题标题】:Django validate one model field against another in adminDjango 在管理员中针对另一个模型字段验证一个模型字段
【发布时间】:2014-05-25 03:20:13
【问题描述】:

假设一个模型有两个 DateTimeFields:

class Tourney(models.Model):
    registration_deadline = models.DateTimeField()
    start_date = models.DateTimeField()

当用户尝试从 Django 管理员中提交 Tourney 时,如何在保存到数据库之前测试 registration_deadline 是否在 start_date 之前,如果有错误,当然内联通知用户,就像 Django 如果有任何其他验证错误一样?

基本上,我正在寻找自定义管理员验证。This Django 文档的一部分很接近,但似乎适用于表单。如何从 Django 的管理员中执行“清理和验证相互依赖的字段”?即使只是指向文档中正确位置的指针也足够了。

编辑:我认为这与 validators 有关,但它们似乎只能测试一个值,而不是同时测试两个值...

【问题讨论】:

    标签: python django validation


    【解决方案1】:
    from django import forms
    from django.contrib import admin
    
    from .models import Tourney
    
    
    class TourneyAdminForm(forms.ModelForm):
        class Meta:
            model = Tourney
            fields = '__all__'
    
        def clean(self):
            if self.cleaned_data['registration_deadline'] > self.cleaned_data['start_date']:
                raise forms.ValidationError('Registration deadline must be before the start date')
            return self.cleaned_data
    
    
    class TourneyAdmin(admin.ModelAdmin):
        form = TourneyAdminForm
    
    
    admin.site.register(Tourney, TourneyAdmin)
    

    【讨论】:

    • 所以只需要扩展基本的 ModelAdminForm。现在我知道了 :)。你甚至猜到了我已经拥有的 TourneyAdmin 的名字 =P。谢谢你这么简单的回答!
    • 较新版本的 Django 在没有 fields = '__all__' 属性的情况下抛出异常。请参阅this q&a 了解更多信息。我所做的包含此更改的编辑被拒绝,因此我将在此处留下此评论。
    猜你喜欢
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 2017-02-28
    • 2012-09-18
    • 2020-06-23
    • 2019-03-11
    • 1970-01-01
    • 2020-02-13
    相关资源
    最近更新 更多