Django 管理员在模型保存期间返回自定义错误消息

Posted

技术标签:

【中文标题】Django 管理员在模型保存期间返回自定义错误消息【英文标题】:Django admin return custom error message during model saving 【发布时间】:2011-10-12 20:45:29 【问题描述】:

我想在 Django 管理页面的save_model 函数中返回一些自定义错误消息。

class EmployerAdmin(admin.ModelAdmin):
  exclude = ('update_user','updatedate','activatedate','activate_user')

  def save_model(self, request, obj, form, change):
    if obj.department != None and obj.isDepartmentSuggested:
        obj.isDepartmentSuggested =False
    else:
       return "You don't set a valid department. Do you want to continue ?"

    obj.update_user = request.user
    obj.updatedate = datetime.datetime.now()
    obj.save()

当然,Else 部分不正确,但我想说明我想要什么。

我很高兴向我推荐一种方法或文件来做到这一点。 谢谢

【问题讨论】:

【参考方案1】:

您需要使用表单在您的 EmployerAdmin 中进行验证:

#forms.py
from your_app.models import Employer

class EmployerAdminForm(forms.ModelForm):
    class Meta:
        model = Employer

    def clean(self):
        cleaned_data = self.cleaned_data
        department = cleaned_data.get('department')
        isDepartmentSuggested = cleaned_data.get('isDepartmentSuggested')
        if department == None and not isDepartmentSuggested:
            raise forms.ValidationError(u"You haven't set a valid department. Do you want to continue?")
        return cleaned_data

#admin.py
from django.contrib import admin
from your_app.forms import EmployerAdminForm
from your_app.models import Employer

class EmployerAdmin(admin.ModelAdmin):
    exclude = ('update_user','updatedate','activatedate','activate_user')
    form = EmployerAdminForm

admin.site.register(Employer, EmployerAdmin)

希望对你有所帮助。

【讨论】:

谢谢。这就是我想要的。您能否告诉我如何在错误消息旁边呈现弹出框或继续按钮?或者我应该:) 首先,您需要将相关字段设置为不需要和/或在适用时为空,因为您想让人们继续,即使他们没有做出选择。要弹出窗口,您需要一个 javascript“确认”对话框。看看:jqueryui.com/demos/dialog/#modal-confirmation 以获得一些想法。 当我想用一些额外的方法检查上传的文件然后返回错误时,你能建议我解决方案吗? 由于表单验证和 save_model 不是原子运行的,(我刚刚测试过这个,我在 django v1.5 上)在某些情况下,有必要在 save_model() 中执行最终验证只是为了确保您没有使用过时的数据执行保存。并发操作可能在 clean() 之后但在 save_model() 之前更改了值,如果允许的值依赖于先前的值,那么在 clean() 内部进行验证将会有问题。唯一的解决方案是在 save_model() 中执行 select_for_update() 来锁定行,然后在保存之前执行最终验证。【参考方案2】:

我使用的是 Django 1.6.3,我想补充一下 Brandon 的答案。

EmployerAdmin 类下面添加admin.site.register(Employer, EmployerAdmin) 作为单独的行;也就是说,在form = EmployerAdminForm 下方,不缩进。

我花了一些时间才弄清楚为什么 Brandon 的答案对我不起作用并且验证没有运行,显然,您只需要先在管理员上注册即可。

干杯。

【讨论】:

这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post。 问题是,我没有足够的代表点数,我觉得应该分享一下,以免其他人遇到我之前遇到的麻烦。 :) 抱歉,我忘记了管理员注册。我已经更新了我的答案。

以上是关于Django 管理员在模型保存期间返回自定义错误消息的主要内容,如果未能解决你的问题,请参考以下文章

如何使用django自定义表单保存多个到多个字段

管理员的 Django 管理员自定义保存功能与普通员工用户不同

Django Admin后台管理

django 在模型自定义保存中访问上传的文件,最佳实践?

如何在用户导航期间在 Django 中保存自定义用户模型

Django - 自定义模型保存方法不显示属性值