2010-02-12 6 views
5

Sto facendo alcune cose sul 'pulito' in un ModelForm admin:Come accedere a request.user da un metodo di amministrazione 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 

Oltre ai threadlocals Incisione - Come si accede request.user per impostare un messaggio? Non posso passarlo al costruttore del form perché non viene chiamato dal mio codice.

risposta

4

Non è possibile farlo sul modulo senza passare l'utente al costruttore di moduli. Invece è possibile utilizzare la funzione ModelAdmin.save_model alla quale viene assegnato l'oggetto richiesta.

Procedimento save_model viene dato il HttpRequest, un'istanza modello, un'istanza ModelForm e un valore booleano a seconda se si sta aggiungendo o cambiando l'oggetto. Qui puoi fare qualsiasi operazione di pre o post-salvataggio.

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

Edit: Dal momento che si vuole mettere la logica/messaggi in funzione di pulizia si potrebbe fare qualcosa di simile:

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) 

Molto tardi edit:

user.message_set è impostato per essere deprecato in Django 1.4. Dovresti invece usare ModelAdmin.message_user. https://docs.djangoproject.com/en/1.3/ref/contrib/admin/#django.contrib.admin.ModelAdmin.message_user

+1

Mmmmm. Il messaggio dipende da una logica di convalida, quindi è molto più sensato vivere nel metodo modelForm clean(). Se lo sposto in ModelAdmin save_model() dovrò scrivere qualche logica disordinata solo per inviare un messaggio! –

+0

Punto giusto. Controlla la mia modifica e vedi se questo ha aiutato. –

+0

Ho spostato user_messages in init del modulo e ho aggiunto self. alla riga 'user_messages.append' e questo ha funzionato a meraviglia! Grazie. –

-1

Dovresti esplicitamente passarlo lì nel costruttore, che non è una cosa, che di solito è fatto.

Sei sicuro di voler mettere quella roba in una forma? Cosa ti piacerebbe esattamente fare lì? Non sta aumentando abbastanza il numero ValidationError?

+0

Come accennato, il Costruttore non è nel mio codice: è in contrib.admin. Il messaggio che voglio inviare non è un errore. È una notifica quando il salvataggio del modulo ha interessato un'altra parte del sistema. –

+0

Ma questo è strano - come puoi essere sicuro, che devi inviare il messaggio prima di salvare effettivamente l'oggetto dal modulo? Potrebbero accadere molte cose diverse tra clean e save. – gruszczy

+0

Tenendo presente che stiamo parlando della modifica dell'amministratore vista che cosa è probabile che accada tra clean e save? –

Problemi correlati