2010-02-05 3 views
3

J'essaie d'accéder à un utilisateur authentifié dans une classe de formulaire. Je jouais en passant l'objet request d'une vue à la classe init, mais il semblait négligé. Existe-t-il un meilleur moyen d'accéder à l'utilisateur authentifié ou à l'objet de demande en dehors d'une vue?Accéder à un utilisateur authentifié en dehors d'une vue

class LicenseForm(forms.Form): 
    '''def __init__(self, *args, **kwargs): 
    #self.fields['license'] = forms.ModelChoiceField(queryset=self.license_queryset(), empty_label='None', widget=forms.RadioSelect())''' 

    def license_queryset(): 
     queryset = License.objects.filter(organization__isnull=True) 
     # add addtional filters if the logged in user belongs to an organization 
     return queryset 

    licenses = forms.ModelChoiceField(queryset=license_queryset(), empty_label='None', widget=forms.RadioSelect()) 

Répondre

2

Oui, vous pouvez le faire, voici les instructions: http://code.djangoproject.com/wiki/CookBookThreadlocalsAndUser

Bien que cela fonctionne personnellement, je préfère passer l'utilisateur à la forme dans la vue. Cela ressemble moins à un hack.

Vous pourriez également montrer votre code, peut-être qu'il peut être amélioré. Pourquoi devez-vous accéder à l'utilisateur dans le formulaire?

Mise à jour: Vous pouvez faire quelque chose comme ceci:

class LicenseForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
     super(LicenseForm, self).__init__(*args, **kwargs) 
     self._user = kwargs.get('user',None) 
     self.fields['licenses'] = forms.ModelChoiceField(queryset=self.license_queryset(), empty_label='None', widget=forms.RadioSelect()) 

    def license_queryset(self): 
     queryset = License.objects.filter(organization__isnull=True) 
     if self._user and self._user.belongsTo('SomeOrganization'): 
      queryset = queryset.filter(whatever='fits') 
     return queryset 

Imho cette approche est beaucoup plus propre que déconner avec des fils locaux.

+0

J'ai modifié mon message original pour montrer le code avec lequel je travaille. Donc, dans la méthode license_queryset, je souhaite ajouter des filtres supplémentaires en fonction des associations d'utilisateurs authentifiés. Le commentaire __init__ est l'endroit où j'allais accepter l'objet de requête de la vue. – CrashRoX

+0

Votre droite, cela semble plus propre. J'apprécie toute votre aide. J'ai joué avec la même approche de code plus tôt mais j'ai continué à rencontrer le problème de pouvoir accéder à self dans license_queryset. J'ai dû créer le champ de formulaire de licences dynamiquement dans init pour le contourner. Existe-t-il un moyen de faire en sorte que license_queryset ait une portée autonome et soit toujours capable de l'appeler à partir de la déclaration de formulaire de licence? Désolé si ce sont des questions newb. Juste commencer avec django et python :) – CrashRoX

+0

@CrashRoX: Vous avez raison, j'ai oublié sur un point important. Changé. Lorsque vous définissez des méthodes de classe, vous devez toujours fournir au moins un paramètre (appelé 'self' pour plus de commodité). Plus tard, quand vous appelez cette fonction, vous n'avez pas besoin de la passer, c'est fait automatiquement. Cela pourrait vous aider à entrer dans le: http://docs.python.org/tutorial/classes.html –

Questions connexes