2009-03-17 14 views
13

¿Hay alguna forma de hacer lo siguiente posible, o debería hacerse en otro lugar?Django Forms, establezca un valor inicial para 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 

Respuesta

6

Es posible que desee manejar esto en su función de vista. Dado que su función de vista debe crear la forma inicial, y su función de vista conoce al usuario.

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

Esto activará la validación de esta entrada, por cierto, lo que no puede proporcionar valores de sugerencia de esta manera.

5

Un Otra solución con Middleware y guardar el volver a escribir: Con la solución de middleware Puede llamar "solicitud" en todas partes.


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

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

¿Tengo que importar algo para usar este método 'get_request()'? – Throoze

+0

¿qué se almacena en '_request [currentThread()]'? ¿es una referencia al objeto 'request' o su valor? lo que realmente quiero saber es: ¿algún cambio posterior hecho (por otro middleware, por ejemplo) se reflejaría en él? en caso contrario, ¿no sería mejor almacenarlo en el método 'process_view()', en el middleware? ¡Gracias por tu respuesta! – Throoze

5

Para una respuesta completa, aquí está la solución CBV:

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