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 管理员在模型保存期间返回自定义错误消息的主要内容,如果未能解决你的问题,请参考以下文章