我在管理员ModelForm上的'clean'做了一些事情:
class MyAdminForm(forms.ModelForm):
def clean(self):
# Some stuff happens...
request.user.message_set.create(message="Some stuff happened")
class MyAdmin(admin.ModelAdmin):
form = MyAdminForm
除了threadlocals hack之外 - 我如何访问request.user来设置消息?我无法将其传递给表单构造函数,因为不会从我的代码中调用它。
答案 0 :(得分:4)
如果不将用户传递给表单构造函数,则无法在表单上执行此操作。相反,您可以使用给定请求对象的ModelAdmin.save_model
函数。
给出了save_model方法 HttpRequest,一个模型实例,一个 ModelForm实例和布尔值 根据是添加还是添加 改变对象。在这里你可以做到 任何保存前或保存后的操作。
http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_model
编辑: 由于您希望将逻辑/消息放在clean函数中,您可以执行以下操作:
class MyAdminForm(forms.ModelForm):
user_messages = []
def clean(self):
# Some stuff happens...
user_messages.append("Some stuff happened")
class MyAdmin(admin.ModelAdmin):
form = MyAdminForm
def save_model(self, request, obj, form, change):
for message in form.user_messages:
request.user.message_set.create(message=message)
很晚编辑:
user.message_set
设置为在Django 1.4中弃用。您应该使用ModelAdmin.message_user
。 https://docs.djangoproject.com/en/1.3/ref/contrib/admin/#django.contrib.admin.ModelAdmin.message_user
答案 1 :(得分:-1)
你必须在构造函数中明确地传递它,这通常不会发生。
您确定要将这些内容放入表单中吗?你到底想做什么?是不是在提高ValidationError
?