112 votes

Comment puis-je accéder à l’objet de la demande ou de toute autre variable dans un formulaire ' méthode clean() s ?

J’essaie de request.user pour méthode propre d’un formulaire, mais comment je peux accéder à l’objet de la demande ? Puis-je modifier la méthode propre pour permettre l’entrée des variables ?

184voto

Daniel Roseman Points 199743

La réponse de Ber - stocker dans threadlocals - est une très mauvaise idée. Il n’y a absolument aucune raison de faire de cette façon.

Une bien meilleure façon consiste à substituer du formulaire méthode pour prendre un paramètre de mot clé supplémentaire, . Cette option stocke la demande dans le formulaire, où c’est nécessaire, et où vous pouvez y accéder dans votre propre méthode.

et, à votre avis :

36voto

Chris Pratt Points 53859

Mis à jour le 25/10/2011: J’utilise maintenant cela avec une Métaclasse au lieu de la méthode, comme Django 1.3 affiche quelques bizarreries dans le cas contraire.

Puis vous remplacez `` comme suit :

Vous pouvez accéder à l’objet de la demande depuis n’importe quelle méthode de avec .

18voto

Ber Points 10364

L'habitude, l'approche consiste à stocker l'objet de la requête dans un thread local de référence à l'aide d'un middleware. Ensuite, vous pouvez accéder à partir de n'importe où dans votre application, y compris le Formulaire.méthode clean ().

La modification de la signature du Formulaire.méthode clean() signifie que vous devez vous propre version modifiée de Django, qui peut ne pas être ce que vous voulez.

Merci middleware compter ressembler à quelque chose comme ceci:

import threading
_thread_locals = threading.local()

def get_current_request():
    return getattr(_thread_locals, 'request', None)

class ThreadLocals(object):
    """
    Middleware that gets various objects from the
    request object and saves them in thread local storage.
    """
    def process_request(self, request):
        _thread_locals.request = request

Enregistrer cette middleware comme décrit dans la Django docs

10voto

entropy Points 1883

Je suis tombé sur ce problème particulier lors de la personnalisation de l’admin. J’ai voulu un certain domaine pour être validé basé sur les informations d’identification de l’admin le particulier.

Étant donné que je ne voulais pas modifier la vue pour transmettre la demande en tant qu’argument à la forme, voici ce que j’ai fait :

3voto

sysfault Points 2761

fromage frais de cheesebaker@pypi : django-requestprovider

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X