在重写save_model()函数时如何在admin.py中使用验证?

时间:2011-02-25 06:35:17

标签: django django-admin

Admin.py

class CourseAdmin(admin.ModelAdmin):

list_display = ('course_code', 'title', 'short' )

 def save_model(self, request, obj, form, change):
    import os

    #obj.author = request.user
    dir_name = obj.course_code
    path = settings.MEDIA_ROOT +os.sep+'xml'+os.sep+dir_name

    #if user updates course name then course would be renames
    if change:
        dir_name = Course.objects.get(pk=obj.pk).course_code
        src = settings.MEDIA_ROOT +os.sep+'xml'+os.sep+dir_name      
        os.rename(src,path)
    else:
        if not os.path.exists(path):
            os.makedirs(path)
            obj.save()

        else:
            raise ValidationError('Bla Bla')


admin.site.register(Course, CourseAdmin)

当我提出验证错误时它不起作用并显示错误页面 异常类型:验证错误 例外值:[u'Bla Bla']

6 个答案:

答案 0 :(得分:7)

根据model admin methods上的django文档,save_model()无论如何都必须保存对象。您只能使用此方法在保存之前执行额外处理。我同意Wogan,你应该创建一个自定义ModelForm并覆盖它的clean()方法并在那里引发错误。

答案 1 :(得分:5)

在自定义ModelForm中进行验证,然后告诉您的ModelAdmin使用该表单。

Django Documentation的这一部分可以帮助你。

答案 2 :(得分:1)

你可以使用类似的东西

from django.contrib import messages

messages.error(request, '<Your message>')

它将被保存,但用户可以看到出现问题。

答案 3 :(得分:0)

以下是一个例子:

def clean_name(self):
    if something:
        raise forms.ValidationError("Something went wrong")
    return self.cleaned_data["name"]

答案 4 :(得分:0)

你应该创建一个表单 -

在CourseAdminForm中:

class CourseAdminForm(forms.ModelForm):

    def clean(self):
        raise ValidationError("Bla Bla") 

答案 5 :(得分:0)

最简单的方法,无需创建自定义表单然后使用它:

1.在你的Models.py中添加&#34;空白=真&#34;例如:

Zone_Name = models.CharField(max_length=100L,unique=True,blank=True )

2.在同一类Models.py(不在Admin.py中)中创建或添加现有的Clean方法,对所需字段进行验证,例如:

def clean(self):
         if self.Zone_Name == None or not self.Zone_Name :
            raise ValidationError("Zone name is not given!")