如何从管理ModelForm清理方法访问request.user?

时间:2010-02-12 13:44:34

标签: django django-admin django-forms

我在管理员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来设置消息?我无法将其传递给表单构造函数,因为不会从我的代码中调用它。

2 个答案:

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

答案 1 :(得分:-1)

你必须在构造函数中明确地传递它,这通常不会发生。

您确定要将这些内容放入表单中吗?你到底想做什么?是不是在提高ValidationError