2009-03-17 14 views
13

C'è un modo per rendere possibile quanto segue, o dovrebbe essere fatto altrove?Forme Django, impostare un valore iniziale su request.user

class JobRecordForm(forms.ModelForm): 
    supervisor = forms.ModelChoiceField(
     queryset = User.objects.filter(groups__name='Supervisors'), 
     widget  = forms.RadioSelect, 
     initial  = request.user # is there some way to make this possible? 
    )  
    class Meta: 
     model = JobRecord 

risposta

6

Si potrebbe voler gestire questo nella funzione di visualizzazione. Poiché la funzione di visualizzazione deve creare il modulo iniziale e la funzione di visualizzazione conosce l'utente.

form = JobRecordForm({'supervisor':request.user}) 

In tal modo, la convalida di questo ingresso, BTW, quindi non è possibile fornire i valori di suggerimento in questo modo.

5

Una Un'altra soluzione con Middleware e salvare la riscrittura: Con la soluzione middleware Si può chiamare "richiesta" in tutto il mondo.


"" "Middleware """

# coding: utf-8 
from django.utils.thread_support import currentThread 
_requests = {} 

def get_request(): 
    return _requests[currentThread()] 

class GlobalRequestMiddleware(object): 
    def process_request(self, request): 
     _requests[currentThread()] = request 

"" "salvare Rewrinting """

class Production(models.Model): 
    creator = models.ForeignKey(User, related_name = "%(class)s_creator") 
    creation_date = models.DateTimeField(auto_now_add = True) 
    modification_date = models.DateTimeField(auto_now = True) 

    def save(self, force_insert = False, force_update = False): 

     self.creator = get_request().user 
     super(Production, self).save(force_insert = force_insert, force_update = force_update) 
     return 
+0

devo importare qualcosa per usare questo metodo 'get_request()'? – Throoze

+0

cosa viene memorizzato in '_request [currentThread()]'? è un riferimento all'oggetto 'request' o al valore di esso? quello che voglio veramente sapere è: ci sarebbe qualche cambiamento in seguito fatto (da altri middleware, ad esempio) su di esso? in caso contrario, non sarebbe meglio memorizzarlo nel metodo 'process_view()', nel middleware? Grazie per la tua risposta! – Throoze

5

Per una risposta completa, ecco la soluzione CBV:

class MyFormView(TemplateView, FormMixin): 
    def get_initial(self): 
     self.initial.update({'your_field': self.request.user}) 
     return super(MyFormView, self).get_initial() 
Problemi correlati