не может переопределить стандартную форму модели администратора django - PullRequest
2 голосов
/ 06 марта 2010

Мне нужно добавить дополнительную проверку к моему DateField в Admin, чтобы убедиться, что указанная дата будет в будущем. У меня нет такого опыта, поэтому вот что я сделал. 1) Я создал настраиваемое поле формы и добавил к нему проверку:

class PastDateField(forms.DateField):
    def clean(self, value):
    """Validates if only date is in the past
    """
        if not value:
            raise forms.ValidationError('Plase enter the date')
        if value > datetime.now():
            raise forms.ValidationError('The date should be in the past, not in future')
        return value

2) Затем я добавил пользовательскую форму модели:

class CustomNewsItemAdminForm(forms.ModelForm):
    title = forms.CharField(max_length=100)
    body = forms.CharField(widget=forms.Textarea)
    date = PastDateField()
    region = forms.ModelChoiceField(Region.objects)

3) А вот как я зарегистрировал администратора:

class NewsItemAdmin(admin.ModelAdmin):
    form = CustomNewsItemAdminForm

    def queryset(self, request):
        return NewsItem.objects.all()

admin.site.register(NewsItem, NewsItemAdmin)

Результатом этого является то, что моя форма администратора 1) Показывает поле, которое я не указал в пользовательской форме администратора 2) Отсутствует календарь JavaScript для поля даты и времени

Для меня совершенно очевидно, что я делаю что-то не так, но я не нашел примеров, относящихся к моим потребностям, так как я нуб. Как лучше добавить пользовательскую проверку в поле даты и времени, не путаясь в этом?

РЕДАКТИРОВАТЬ : Большое спасибо Брайану Люфту и Дэниелу Розману за правильные ответы! Чтобы сделать этот пост полезным для тех, кто сталкивается с той же проблемой, вот код:

class CustomNewsItemAdminForm(forms.ModelForm):
    class Meta:
        model = NewsItem

    def clean_date(self):
        """Validates if only date is in the past
        """
        date = self.cleaned_data["date"]
        if date is None:
            raise forms.ValidationError('Plase enter the date')
        if date > datetime.now().date():
            raise forms.ValidationError('The date should be in the past, not in future')
        return self.cleaned_data["date"]

class NewsItemAdmin(admin.ModelAdmin):
    form = CustomNewsItemAdminForm

    def queryset(self, request):
        return NewsItem.objects.all()

admin.site.register(NewsItem, NewsItemAdmin)

1 Ответ

2 голосов
/ 06 марта 2010

Во-первых, явное объявление полей в ModelForm - независимо от того, является ли оно администратором или вне его - не означает, что другие поля не будут отображаться.Вам необходимо определить кортежи fields или exclude во внутреннем классе Meta формы.Если все остальные поля являются полями по умолчанию, вы можете просто объявить то, что вы переопределяете.

Во-вторых, если вы хотите, чтобы ваше настраиваемое поле использовало JavaScript, вам нужно будет использовать правильный виджет, которыйdjango.contrib.admin.widgets.AdminDateWidget.Тем не менее, существует гораздо более простой способ сделать это, который вообще не определяет пользовательское поле, а вместо этого определяет метод clean_date в самой форме.

...