2010-02-12 18 views
5

que estoy haciendo algunas cosas en la 'limpia' en una ModelForm administrador:¿Cómo acceder a request.user desde un método de limpieza de ModelForm de administración?

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 

Aparte de los threadlocals Corte - ¿cómo se accede request.user para configurar un mensaje? No puedo pasarlo al constructor de formulario porque no recibe una llamada de mi código.

Respuesta

4

No puede hacerlo en el formulario sin pasar al usuario al constructor de formulario. En su lugar, puede usar la función ModelAdmin.save_model a la que se le da el objeto de solicitud.

El método save_model se le da la HttpRequest, una instancia de modelo, un ejemplo ModelForm y un valor booleano en función de si se está añadiendo o cambiar el objeto. Aquí puede hacer cualquier operación anterior o posterior a la grabación.

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

Editar: Puesto que usted quiere poner la lógica/mensajes en la función de limpieza que podría hacer algo como:

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) 

Muy tarde editar:

user.message_set es está en desuso en Django 1.4. En su lugar, debe usar ModelAdmin.message_user. https://docs.djangoproject.com/en/1.3/ref/contrib/admin/#django.contrib.admin.ModelAdmin.message_user

+1

Mmmmm. El mensaje depende de alguna lógica de validación, por lo que tiene mucho más sentido vivir en el método Clean() de ModelForm. Si lo muevo a ModelAdmin save_model() voy a tener que escribir una lógica desordenada solo por enviar un mensaje. –

+0

Punto justo. Verifique mi edición y vea si eso ayudó. –

+0

Moví los user_messages al init del formulario y agregué self. a la línea 'user_messages.append' y eso funcionó! Gracias. –

-1

Tendría que pasarlo explícitamente allí en el constructor, que no es una cosa, que normalmente se hace.

¿Estás seguro de que quieres poner esas cosas en un formulario? ¿Qué es exactamente lo que le gustaría hacer allí? ¿No está aumentando el ValidationError suficiente?

+0

Como mencioné el Constructor no está en mi código, está en contrib.admin. El mensaje que deseo enviar no es un error. Es una notificación cuando el salvar el formulario ha afectado a otra parte del sistema. –

+0

Pero esto es extraño. ¿Cómo puede estar seguro de que debe enviar el mensaje antes de guardar realmente el objeto del formulario? Puede haber muchas cosas diferentes entre limpiar y guardar. – gruszczy

+0

Teniendo en cuenta que estamos hablando de la vista de cambio de administrador ¿qué es probable que ocurra entre limpiar y guardar? –

Cuestiones relacionadas