2017-08-31 3 views
0

L'idée est d'afficher un champ de recherche, où un utilisateur peut taper dans l'adresse, qui est complétée par Google Autocomplete. Ensuite, nous sauvegardons les paramètres lat et long et redirigeons vers le /search (en utilisant POST) ou (peut-être utiliser une requête GET) ou alternativement /search?lat=xxx&long=xxx.Demande POST avec une action de formulaire sur une autre page renvoie 405, ne traite pas request.POST

Pour le second cas, avec des paramètres d'URL que je pourrais utiliser lat = request.GET('lat')

Ma forme Index.html

<form action="{% url 'users:index' %}" method="post" enctype="multipart/form-data"> 
{% csrf_token %} 
<input id="searchTextField" type="text" size="50" placeholder="Enter a location" autocomplete="on" runat="server" /> 
<input type="hidden" id="cityname" name="cityname" /> 
<input type="hidden" id="Lat" name="Lat" /> 
<input type="hidden" id="Lng" name="Lng" /> 
<button type="submit">Submit</button> 
</form> 

Lorsque choix de l'utilisateur dans le menu déroulant, le javascript me donne des valeurs de Lat, Lng et cityname. À soumettre, ils sont redirigés vers /users/, qui est un ListView et a le views.py

class IndexView(ListView): 
    # context_object_name = 'latest_teacher_list' 
    model = Teacher 
    def get_context_data(self, **kwargs): 
     if self.request.method == 'POST' and 'Lat' in self.request.POST: 
      if self.request.POST['Lat'] != '': 
       lat = self.request.POST['Lat'] 
      else: 
       lat = None 
     else: 
      lat = None 
     context = super(IndexView, self).get_context_data(**kwargs) 
     context['teacher_list'] = Teacher.objects.all()[:5] 
     context['lat'] = lat 

     return context 

suivante Cependant, cela me donne une page blanche lorsque je soumets le formulaire. Lorsque form action est vide, il soumet le formulaire à la même page et affiche correctement Lat, Long. Mais lorsque l'action de formulaire est /users/, il me donne une erreur 405.

Une telle chose est-elle possible, ou dois-je faire une requête GET, par ex. transmettre les paramètres d'URL comme un lien, donc au lieu d'une forme, je vais simplement un lien vers:

users?lat=xxx&long=xxx 

où je dois utiliser Js pour remplir xxx en quelque sorte

+0

Avez-vous défini la méthode Post dans votre vue? – WebGuy

+0

Je pense que cela pourrait être le problème ... laissez-moi vérifier – Roma

+0

Ce code de réponse (405) peut provenir d'un certain nombre de problèmes, mais il finit généralement soit que vous utilisez la mauvaise URL ou en utilisant la méthode de demande erronée. – WebGuy

Répondre

2

Le ListView ne dispose pas d'un post méthode définie, il renvoie donc le code d'état 405 pour les demandes de publication.

Vous pouvez définir une méthode post qui appelle simplement la méthode get() de la vue:

class IndexView(ListView): 
    ... 

    def post(self, request, *args, **kwargs): 
     """Allow post requests for form submissions""" 
     return super(IndexView, self).get(request, *args, **kwargs) 
+0

Merci! Recommanderiez-vous d'utiliser GET ou POST est-il préférable pour de tels cas? – Roma

+0

Puisque vous ne modifiez pas les données, une requête GET serait acceptable pour ce formulaire de recherche. – Alasdair

+0

Encore une chose, devrais-je ajouter un formulaire à forms.py et le valider comme https://docs.djangoproject.com/fr/1.11/topics/forms/#the-view – Roma

1

Vous devez définir la méthode post, mais vous pouvez toujours définir la méthode de formulaire GET. C'est même la manière la plus correcte pour un champ de recherche car GET est utilisé pour obtenir des données, POST pour donner des données que le serveur doit stocker ou quelque chose, PUT est pour la mise à jour des données. Vous devriez donc utiliser GET comme méthode de formulaire. De plus, si vous utilisez la méthode GET, les boutons de navigation avant et arrière contiendront également les paramètres 'lat', 'long', ce qui vous permettra d'utiliser les boutons Précédent et Suivant. Aucune génération de lien ne sera nécessaire.

1

Vous avez un formulaire en html, mais votre vue ne gère que les requêtes, vous devez le mettre à jour et hériter de FormView ou ajouter une fonction post avec tout le code de gestion de formulaire.