フォームを検証することはできません。フォーム検証の役割は、たとえば、数値を含むべき値に数値が含まれていることを確認することです。投稿が「下書き」モードであると信じているという事実は、意味のないテキストの文字列ではなく、日付フィールドに日付を含める必要があるという言い訳にはなりません。
あなたが望むのは、通常モードでは特定のフィールドを必須にできるようにすることですが、ドラフトモードではオプションです。
その場合、これはモデルレベルで行われます。カスタム管理フォームを使用して、この動作を強制できます。
# models.py
...
class Post(models.Model):
title = models.CharField(..., null=True, blank=True)
fliddle = models.IntegerField(..., null=True, blank=True)
published = models.BooleanField() # if false, then in draft mode
# admin.py
...
class BlogForm(forms.ModelForm):
class Meta:
model = Post
title = forms.CharField(..., required=False)
fliddle = forms.IntegerField(..., required=False)
def __init__(self, *args, **kwargs):
self.instance = kwargs.get('instance', None)
super(BlogForm, self).__init__(*args, **kwargs)
def clean_title(self):
data = self.cleaned_data.get('title',None)
if self.instance and self.instance.published == True and not data:
raise forms.ValidationError("Title is required.")
return data
def clean_fliddle(self):
data = self.cleaned_data.get('fliddle',None)
if self.instance and self.instance.published == True and not data:
raise forms.ValidationError("Fliddle is required.")
return data
class BlogAdmin(admin.ModelAdmin):
class Meta:
model=Blog
form = BlogForm
admin.site.register(Blog, BlogAdmin)