2010-04-21 13 views

risposta

31

In effetti, esiste un modo per risolvere il problema!

dovrai subclass form fornito da ModelAdmin.get_form() e ignorarlo:

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

Questo è un ottimo modo per risolvere questo! Tuttavia, sono un po 'confuso riguardo al tuo uso del termine "MetaClass" qui. Per come la vedo io, ModelFormMetaClass è solo una superclasse del tuo modulo. Cosa mi manca qui? – mkoistinen

+1

@mkoistinen, hai assolutamente ragione. Questo pensiero mi è venuto in mente qualche volta nel passato, ma ero troppo pigro per correggere la risposta. Poiché la gente usa ancora lo snippet, ho la responsabilità di correggerla. Grazie per il feedback. :-) –

+0

Grazie per l'aggiornamento, e, ho sbagliato nel mio commento sopra. È una * sottoclasse *. Oops! – mkoistinen

0

Nella classe ModelAdmin c'è un numero di ami per consentire di fare ciò: guardare il codice in django.contrib.admin.options.

Due metodi che potrebbero essere d'aiuto per ModelAdmin.save_form e ModelAdmin.save_model, a entrambi viene passato l'oggetto richiesta. In questo modo è possibile ignorare questi metodi nella sottoclasse Admin e eseguire qualsiasi elaborazione aggiuntiva necessaria.

modificato dopo commento

Hai ragione che questo non ti consente di convalidare il modulo dipende privilegi dell'utente. Sfortunatamente l'istanziazione della forma è sepolta in profondità all'interno dei metodi add_view e change_view di ModelAdmin.

Non ci sono molte possibilità senza duplicare un sacco di codice esistente. È possibile sovrascrivere i metodi *_view; oppure puoi provare a ignorare la funzione modelform_factory per restituire una nuova classe con l'oggetto richiesta già inserito; oppure potresti provare a giocherellare con il metodo della classe del modulo __new__ per fare la stessa cosa, ma è complicato a causa della metaclasse del modulo.

+0

Daniel, grazie per la tua risposta! In realtà, ho provato a sovrascrivere questi metodi, eccetto implementare i moduli ... Ma - io ho capito (da una delle tue risposte, se non sto sbagliando) non c'è modo di eseguire la convalida da questi metodi. Con "convalida" intendo l'abilità di non salvare alcuni contenuti se non mi piace qualcosa e allo stesso tempo l'abilità di dare un feedback prezioso. Il mio compito è - la convalida dell'input dell'amministratore dipende dai diritti dell'utente. Forse sto scavando in un posto sbagliato? – Wiseman

+0

Vedere la mia risposta estesa sopra. –

+0

Molte grazie ancora, per un buon mucchio di canne da pesca :). – Wiseman