2010-02-12 56 views
5

我做的“干净”的一些东西对管理员的ModelForm:如何从管理员ModelForm清洁方法访问request.user?

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破解 - 怎样访问request.user设置的消息?我无法将它传递给窗体构造函数,因为它没有从我的代码中调用。

回答

4

如果不将用户传递给窗体构造函数,则无法在窗体上执行此操作。相反,您可以使用给定请求对象的ModelAdmin.save_model函数。

的save_model方法给出 的HttpRequest,模型实例,一个 的ModelForm实例,并根据其是否添加或 改变对象的布尔值 。在这里,您可以执行任何保存前或保存后操作的 。

http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_model

编辑: 既然你想要把逻辑/在清洁功能,你可以做类似的消息:

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_userhttps://docs.djangoproject.com/en/1.3/ref/contrib/admin/#django.contrib.admin.ModelAdmin.message_user

+1

嗯。这个消息依赖于一些验证逻辑,因此在ModelForm clean()方法中生活更有意义。如果我将它移动到ModelAdmin save_model(),我将不得不编写一些凌乱的逻辑,以便发送消息! – 2010-02-12 15:30:17

+0

公平点。检查我的编辑,看看是否有帮助。 – 2010-02-12 16:27:58

+0

我将user_messages移动到表单的init中并添加了self。到'user_messages.append'这一行,这是一种享受!谢谢。 – 2010-02-12 17:41:07

-1

你必须在构造函数中明确地将它传递给构造函数,这不是通常所做的事情。

您确定要将这些东西放入表单吗?你到底想做什么?足够不提高ValidationError

+0

如前所述,构造函数不在我的代码中 - 它在contrib.admin中。 我要发送的消息不是错误。当保存表单影响系统的另一部分时,这是通知。 – 2010-02-12 15:21:56

+0

但这很奇怪 - 你怎么能确定,你应该在实际上从窗体保存对象之前发送消息?清洁和保存之间可能会发生许多不同的事情。 – gruszczy 2010-02-12 16:25:41

+0

考虑到我们正在讨论管理员更改视图,在清理和保存之间可能会发生什么? – 2010-02-12 17:35:35