В администраторе Django, как я могу настроить публикацию в блоге только для проверки, если она не является черновиком? - PullRequest
2 голосов
/ 27 декабря 2010

Я работаю над блогом для Django и хотел бы использовать встроенную валидацию администратора Django. Тем не менее, я хотел бы отключить проверку, если статус сообщения в блоге установлен на «черновик».

По сути, я ищу код, который должен делать что-то вроде этого:

def validate(self, **kwargs):
    ''' do not validate drafts '''
    if self.status != Post.STATUS_DRAFT:
        Super(Post, self).validate(**kwargs)

1 Ответ

3 голосов
/ 27 декабря 2010

Вы не можете не проверять формы.Роль проверки формы заключается в том, чтобы убедиться, что, например, значение, которое должно содержать число, содержит число.Тот факт, что вы считаете, что публикация находится в «черновом» режиме, не оправдывает необходимость в поле даты содержать дату, а не строку бессмысленного текста.поля обязательны для заполнения в обычном режиме, но необязательны в черновом режиме.

В этом случае это делается на уровне модель .Вы можете использовать пользовательскую форму администратора, чтобы обеспечить это поведение:

# 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)
...