Проверка поля администратора Django для возврата ошибки, а не для исключения в приложении
У меня есть модель Django, в которой есть поле для загрузки изображений, я пытаюсь проверить поле изображения, чтобы проверить размер изображения перед сохранением и вернуть элегантное сообщение об ошибке, которое пользователь может исправить.
Я пытался использовать следующий код, но он не работал
admin.py
class BonanzaAdmin(TranslatableAdmin):
list_display = ['get_bonanza_name', 'user_profile', 'publish_date', 'created_by', 'created_at', 'all_translations']
def clean_image(self):
image = self.cleaned_data.get('image')
if not image:
raise forms.ValidationError("No image!")
else:
w, h = get_image_dimensions(image)
if w != 1170:
raise forms.ValidationError("The image is %i pixel wide. It's supposed to be 1170px" % w)
if h != 500:
raise forms.ValidationError("The image is %i pixel high. It's supposed to be 500px" % h)
return image
def save_model(self, request, obj, form, change):
if not change:
obj.created_by = request.user
obj.save()
Целый clean_image() не вызывается, я также пытался изменить имя на image_clean(), но также не работал. В любом случае, я попытался переместить проверку в save_model
class BonanzaAdmin(TranslatableAdmin):
list_display = ['get_bonanza_name', 'user_profile', 'publish_date', 'created_by', 'created_at', 'all_translations']
def save_model(self, request, obj, form, change):
image = obj.image
if not image:
raise forms.ValidationError("No image!")
else:
w, h = get_image_dimensions(image)
if w != 1170:
raise forms.ValidationError("The image is %i pixel wide. It's supposed to be 1170px" % w)
if h != 500:
raise forms.ValidationError("The image is %i pixel high. It's supposed to be 500px" % h)
if not change:
obj.created_by = request.user
obj.save()
теперь второй кусок кода работает нормально, он проходит процесс проверки, но не показывает простого сообщения об ошибке. Вместо этого он выбрасывает исключение! Как я могу заставить его показать ошибку, чтобы пользователь мог исправить и попытаться снова?
PS я использую django 1.4 и django-hvad для перевода, поэтому я наследую от TranslatableAdmin
С уважением
2 ответа
Как сказал demalexx, вы должны использовать дополнительную форму для проверки вашей модели.
class Bonanza(models.Model):
user_profile = models.CharField(max_length = 128)
publish_date = models.DateField()
Используйте любую проверку в вашей форме администратора:
class BonanzaAdminForm(forms.ModelForm):
class Meta:
model = Bonanza
def clean(self):
# Validation goes here :)
raise forms.ValidationError("TEST EXCEPTION!")
И простой автоматически сгенерированный админ:
class BonanzaAdmin(admin.ModelAdmin):
form = BonanzaAdminForm
admin.site.register(Bonanza, BonanzaAdmin)
Вы наследуете ModelAdmin
и у него нет методов проверки. Вместо этого вы должны переопределить form
атрибут для предоставления настраиваемой формы и добавления метода проверки к этой форме. Есть документы о пользовательской проверке в админке: https://docs.djangoproject.com/en/1.4/ref/contrib/admin/