2016-02-29 1 views
0

Comment dans Django je peux accéder à requset dans le formulaire? J'ai besoin de ceci pour obtenir un tuple de données à transmettre dans les choix à former. Ci-dessous approche initialisation ne fonctionne pas: NameError: nom 'demande' est pas définie, avec ou sans auto: self.request.GET.get ('projet') ou request.GET.get (« projet »)Django: Demande d'accès.GET sous forme de passer un jeu de queur en tant que choix

class PostfilterForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
     self.request = kwargs.pop("request") 
     super(PostfilterForm, self).__init__(*args, **kwargs) 

    monitoring_words_to_show = Nlpmonitorword.objects.filter(monitoringwords__name = self.request.GET.get('project')) 
    words_list = [] 
    for word in monitoring_words_to_show: 
     words_list.append((word.monitor_word, word.monitor_word))  
    words_list = tuple(words_list) # trying to get here tuple to pass in choises (('vk', 'vk'), ('fb', 'fb'), ('vkfb', 'vkfb')) 

    project = forms.CharField(required=True, label='') 
    monitor = forms.MultipleChoiceField(widget=forms.SelectMultiple, choices=words_list, required=False, label='') 
+0

double possible de [Comment accéder l'objet de requête ou toute autre variable dans la méthode propre() d'un formulaire?] (Http://stackoverflow.com/questions/1057252/how-do-i-access -the-request-object-or-any-other-variable-in-a-forms-clean-met) – Sayse

+0

Dupliquer fait référence à la question que vous posez, mais vous avez un tas de code montré ici qui n'est pas dans une méthode/fonction qui est probablement le vrai problème. – Sayse

+0

@Sayse J'ai vu cette réponse et pointé en question que cela ne fonctionne pas pour une raison –

Répondre

1

ce que votre formulaire a besoin est pas la demande, il est le projet. Il est préférable de faire face à la demande dans la vue et transmettre les paramètres nécessaires à la forme:

Forme:

class PostfilterForm(forms.Form): 
    def __init__(self, project, *args, **kwargs): 
     self.project = project 

Vue:

project = request.GET.get('project') 
form = PostfilterForm(project, request.POST) 
+0

cela semble raisonnable, pourriez-vous indiquer ce qui se passe après la chaîne init, j'ai essayé def __init __ (self, project, * args, ** kwargs): self.project = kwargs.pop ("projet") super (PostfilterForm, self) .__ init __ (projet, * args, ** kwargs) mais une erreur est survenue NameError: le nom 'projet' n'est pas défini –

+0

en passant le paramètre un kwarg puis un pop-up est un autre moyen mais comme le formulaire a toujours besoin du projet et qu'il ne s'agit pas d'un paramètre optionnel, je préfère l'utiliser comme argument obligatoire. Supprimez simplement la ligne pop et utilisez le projet car il est transmis à la fonction init en tant que paramètre par la vue. – nima

+0

hm, étrange. avec cette modification: si passer 'erreur de projet NameError: nom' projet 'n'est pas défini, puis, si passer self.project l'erreur NameError: nom' self 'n'est pas défini –

1

Tout le code que vous essayez d'utiliser n'est pas utilisé dans une méthode qui signifie qu'il n'appartient à aucune instance d'un PostFilterForm et n'a donc aucune connaissance de self et encore moins de ses champs.

Vous devriez inclure ces fonctions dans une fonction, bien que la fonction qui devrait être n'est pas claire.

def my_function(self): 
    monitoring_words_to_show = Nlpmonitorword.objects.filter(monitoringwords__name = self.request.GET.get('project')) 
    words_list = [] 
    for word in monitoring_words_to_show: 
     words_list.append((word.monitor_word, word.monitor_word))  
    words_list = tuple(words_list) # trying to get here tuple to pass in choises (('vk', 'vk'), ('fb', 'fb'), ('vkfb', 'vkfb'))