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

And*_*ker 5 django django-forms django-admin

我正在管理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
Run Code Online (Sandbox Code Playgroud)

除了threadlocals hack之外 - 我如何访问request.user来设置消息?我无法将其传递给表单构造函数,因为不会从我的代码中调用它.

Mar*_*vin 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)
Run Code Online (Sandbox Code Playgroud)

很晚的编辑:

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