2009-03-17 9 views
13

Gibt es eine Möglichkeit, das Folgende zu ermöglichen, oder sollte es anderswo gemacht werden?Django Forms, setzen Sie einen Anfangswert für 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 

Antwort

6

Sie könnten dies in Ihrer Sichtfunktion behandeln. Da Ihre View-Funktion das Ausgangsformular erstellen muss und Ihre View-Funktion den Benutzer kennt.

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

Dies wird die Validierung dieses Eingangs auslösen, BTW, sodass Sie auf diese Weise keine Hinweiswerte bereitstellen können.

5

Eine andere Lösung mit Middleware und speichert Umschreiben: Mit Middleware-Lösung Sie können auch anrufen „Anfrage“ überall.


"" "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 

"" "Rewrinting speichern """

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

Muss ich etwas importieren, um diese 'get_request()' Methode zu verwenden? – Throoze

+0

Was ist in _request [currentThread()] gespeichert? Ist es ein Verweis auf das Objekt "Anfrage" oder den Wert davon? Was ich wirklich wissen möchte, ist: Würde eine spätere Änderung (z. B. durch andere Middleware) darauf reflektiert werden? Falls nicht, wäre es nicht besser, es in der 'process_view()' Methode in der Middleware zu speichern? Danke für deine Antwort! – Throoze

5

Eine vollständige Antwort, hier ist die CBV Lösung:

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