2010-04-21 20 views

Respuesta

31

¡De hecho, hay una manera de resolver su problema!

Tendrá que subclass form proporcionada por ModelAdmin.get_form() y anularlo:

class BusinessDocumentCommentForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     self.request = kwargs.pop('request', None) 
     # Voila, now you can access request anywhere in your form methods by using self.request! 
     super(BusinessDocumentCommentForm, self).__init__(*args, **kwargs) 
     if self.request.GET.get('document_pk', False): 
      #Do something 
    def clean(self): 
     # Do something with self.request 
     # etc.  
    class Meta: 
     model = BusinessDocumentComment 

class BusinessDocumentCommentAdmin(admin.ModelAdmin): 

    form = BusinessDocumentCommentForm  

    def get_form(self, request, obj=None, **kwargs): 

     AdminForm = super(BusinessDocumentCommentAdmin, self).get_form(request, obj, **kwargs) 

     class AdminFormWithRequest(AdminForm): 
      def __new__(cls, *args, **kwargs): 
       kwargs['request'] = request 
       return AdminForm(*args, **kwargs) 

     return AdminFormWithRequest 
+0

¡Esta es una gran manera de resolver esto! Sin embargo, estoy un poco confundido acerca de su uso del término 'MetaClass' aquí. Tal como lo veo, ModelFormMetaClass es solo una superclase de tu forma. ¿Que me estoy perdiendo aqui? – mkoistinen

+1

@mkoistinen, tienes toda la razón. Este pensamiento se me ocurrió alguna vez en el pasado, pero era demasiado flojo para corregir la respuesta. Como las personas todavía usan el fragmento, tengo la responsabilidad de corregirlo. Gracias por la retroalimentación. :-) –

+0

Gracias por actualizar, y lo entendí mal en mi comentario anterior. Es una * subclase *. Oops! – mkoistinen

0

Hay una serie de ganchos en la clase ModelAdmin que le permiten hacer esto: mire el código en django.contrib.admin.options.

Dos métodos que pueden serle de ayuda son ModelAdmin.save_form y ModelAdmin.save_model, los cuales se pasan el objeto de solicitud. De modo que puede anular estos métodos en su subclase de administración y hacer cualquier procesamiento adicional que necesite.

editar después de comentario

Tienes toda la razón de que esto no le permitirá validar la forma depende de los privilegios del usuario. Desafortunadamente, la creación de instancias de formularios está profundamente oculta en los métodos add_view y change_view de ModelAdmin.

No hay muchas posibilidades sin duplicar una gran cantidad de código existente. Puede anular los métodos *_view; o podría intentar y anular la función modelform_factory para devolver una nueva clase con el objeto de solicitud ya procesado; o podría intentar manipular el método de la clase de formulario __new__ para hacer lo mismo, pero eso es complicado debido a la forma metaclass.

+0

Daniel, ¡gracias por tu respuesta! En realidad, he tratado de sobreescribir estos métodos, antes de implementar formularios ... Pero - nosotros entendimos (de una de sus respuestas, si no estoy confundiendo) que no hay forma de realizar la validación de estos métodos. Por "validación", me refiero a la capacidad de no guardar contenido si no me gusta algo y al mismo tiempo la capacidad de dar algunos comentarios valiosos. Mi tarea es la validación de la entrada de administrador en función de los derechos de los usuarios. Puede ser que estoy cavando en un lugar equivocado? – Wiseman

+0

Ver mi respuesta extendida más arriba. –

+0

Muchas gracias de nuevo, por un buen grupo de cañas de pescar :). – Wiseman

Cuestiones relacionadas