欢迎访问宙启技术站
智能推送

如何在Django.contrib.admin.widgets.AdminDateWidget()中设置可选日期范围

发布时间:2024-01-08 22:26:58

在Django中使用django.contrib.admin.widgets.AdminDateWidget()时设置可选日期范围可以通过使用表单验证器(validators)来实现。验证器是一种在表单验证过程中用于验证字段值的方法。在验证器中,我们可以定义自定义的验证规则。

下面是一个可以在AdminDateWidget()中设置可选日期范围的示例:

from django import forms
from django.contrib.admin.widgets import AdminDateWidget
from django.contrib.admin.options import BaseModelAdmin
from datetime import datetime

class DateRangeForm(forms.ModelForm):
    start_date = forms.DateField(widget=AdminDateWidget(attrs={'class': 'date-input'}))
    end_date = forms.DateField(widget=AdminDateWidget(attrs={'class': 'date-input'}))
    
    class Meta:
        model = YourModel
        fields = '__all__'
    
    def clean(self):
        cleaned_data = super().clean()
        start_date = cleaned_data.get("start_date")
        end_date = cleaned_data.get("end_date")
        
        # 验证结束日期是否在开始日期之后
        if start_date and end_date and start_date > end_date:
            raise forms.ValidationError("结束日期必须在开始日期之后")
        
        return cleaned_data

在上述代码中,我们定义了一个DateRangeForm类来扩展ModelForm。我们使用AdminDateWidget作为日期字段的小部件,并为其添加了一个class属性,以便我们可以在CSS中对其进行样式设置。

clean()方法中,我们获取了start_dateend_date的值,并进行了一些自定义验证。在这个示例中,我们验证结束日期是否在开始日期之后。如果验证不通过,我们会抛出一个ValidationError,并显示一个错误消息。

接下来,我们可以在ModelAdmin中使用该表单类:

from django.contrib import admin

@admin.register(YourModel)
class YourModelAdmin(admin.ModelAdmin):
    form = DateRangeForm

通过在ModelAdmin中设置form属性为我们刚刚创建的DateRangeForm,我们可以在Admin中使用AdminDateWidget并且应用可选的日期范围验证。

在Admin中,start_dateend_date字段将显示为日期选择器,并且结束日期必须在开始日期的后面,否则会显示错误消息。

这是一个简单的例子,你可以根据你的需求进行修改和扩展。希望这可以帮助到你。