2010-07-11 5 views
1

I en utilisant Django et une vue générique « django.views.generic.create_update.create_object » J'ai une forme de modèle Wich je passe à la vue générique:demande Pass pour le formulaire type à l'aide vue générique dans Django

url(r'^add$', create_object, {'template_name':'tpl.html','form_class':MyModelForm,'post_save_redirect':'/'},name = 'add'), 

Je dois obtenir l'utilisateur actuel dans ma méthode ModelForm.save .. Mais je ne peux pas trouver le moyen de l'obtenir, s'il vous plaît aidez-moi à trouver un moyen pratique?

class MyModelForm(forms.ModelForm):

class Meta: 
    model = MyModel 


def save(self,*a,**b): 
    MyModel.save(user=request.user) #how can i get here request.user? 

En voie commune, la question est - comment puis-je accsess params demande dans les formes transmises à vue générique.

+0

hmm, je suis curieux de savoir ce que bien. cela vous dérange-t-il d'écrire votre propre gestionnaire générique, ou devez-vous utiliser le gestionnaire standard et le faire fonctionner ici? l'ancien j'ai fait, mais pas encore le dernier ... – eruciform

+0

de préférence je veux utiliser des vues génériques. Je vois une solution pour utiliser middleware par exemple pour attacher request.user directement à MyModelForm, mais j'ai aussi des problèmes là (MyModelForm instanse est passé de l'import à l'import .. Je ne sais pas pourquoi mais j'ai différentes instances d'objets de classe dans save method et ma fonction middleware, et je perds mon paramètre attaché en save). D'une autre manière je pense que cela peut être fait dans apply_extra_context il peut être utilisé quelque chose comme ce contexte [clé] = valeur (demande), mais il utilise seulement le contexte [clé] = valeur() ... – Evg

Répondre

1

thnx cela aide) J'ai quelques problèmes cette syntaxe et _meta attr et je finis avec ce

def create_object_with_request(request, *args, **kwargs):

def inject_request(fun): 

    def helper(*args, **kwargs): 
     finst = fun(*args, **kwargs) 
     finst.request = request 
     return finst 

    helper._meta = fun._meta 
    return helper 
kwargs['form_class'] = inject_request(kwargs['form_class']) 
return create_object(request,*args, **kwargs) 

2

Vous pourriez probablement hacker quelque chose pour injecter la requête dans l'instanciation de formulaire, mais pourquoi vous embêteriez-vous? Les vues génériques sont conçues comme une solution rapide et simple aux exigences de base uniquement. Dès que vous commencez à avoir besoin de personnalisations massives, il vaut mieux écrire vous-même la vue réelle. Ce n'est pas beaucoup de code, après tout.

1

Regardez que:

url(r'^add$', create_object_with_request, {'template_name':'tpl.html','form_class':MyModelForm,'post_save_redirect':'/'},name = 'add'), 

,

def create_object_with_request(request, *args, **kwargs): 
    def inject_request(fun): 
     def helper(*args, **kwargs): 
      return fun(*args, request=request, **kwargs) 
     return helper 
    kwargs['form_class'] = inject_request(kwargs['form_class']) 
    return create_object(request, *args, **kwargs) 

Alors vous avez passé demande à votre constructeur de classe. Ou vous pouvez l'ajouter comme attribut:

def create_object_with_request(request, *args, **kwargs): 
    def inject_request(fun): 
     def helper(*args, **kwargs): 
      res = fun(*args, **kwargs) 
      res.request = request 
      return res 
     return helper 
    kwargs['form_class'] = inject_request(kwargs['form_class']) 
    return create_object(request, *args, **kwargs) 
+0

thnx ça aide) – Evg

Questions connexes