Question

Je suis en train de définir des expressions régulières afin de capturer les paramètres dans une URL, comme décrit dans le tutoriel. Comment accéder aux paramètres à partir de l'URL dans l'objet HttpRequest? Mon HttpRequest.GET retourne actuellement un objet QueryDict vide.

J'aimerais apprendre à faire cela sans bibliothèque afin de mieux connaître Django.

Était-ce utile?

La solution

Lorsque l'URL est semblable à: domain/search/?q=haha ,  Ensuite, vous utiliseriez request.GET.get('q', '').

q est le paramètre souhaité et '' la valeur par défaut si URLconf n'est pas trouvé.

Cependant, si vous configurez simplement votre regex , vos captures du views.py sont transmises à la fonction sous forme d'arguments (ou d'arguments nommés).

Tels que:

(r'^user/(?P<username>\w{0,50})/$', views.profile_page,),

Ensuite, dans votre <=> vous auriez

def profile_page(request, username):
    # Rest of the method

Autres conseils

Pour clarifier l'explication de camflan, supposons que vous ayez

  • la règle url(regex=r'^user/(?P<username>\w{1,50})/$', view='views.profile_page')
  • a dans la demande entrante pour http://domain/user/thaiyoshi/?message=Hi

La règle de répartition d'URL récupérera des parties du chemin de l'URL (ici "user/thaiyoshi/") et les transmettra à la fonction de vue avec l'objet de requête.

La chaîne de requête (ici message=Hi) est analysée et les paramètres sont stockés sous forme de QueryDict dans request.GET. Aucune correspondance ni traitement supplémentaire pour les paramètres HTTP GET n’est effectué.

Cette fonction de vue utiliserait les parties extraites du chemin d'URL et un paramètre de requête:

def profile_page(request, username=None):
    user = User.objects.get(username=username)
    message = request.GET.get('message')

En remarque, vous trouverez la méthode de requête (dans ce cas "GET", et pour les formulaires soumis généralement "POST") dans request.method. Dans certains cas, il est utile de vérifier que cela correspond à vos attentes.

Mettre à jour: Pour décider si vous souhaitez utiliser le chemin de l'URL ou les paramètres de requête pour transmettre des informations, voici ce qui peut vous aider:

  • utilisez le chemin de l'URL pour identifier les ressources de manière unique, par exemple. /blog/post/15/ (pas /blog/posts/?id=15)
  • utilisez des paramètres de requête pour modifier le mode d'affichage de la ressource, par exemple. /blog/post/15/?show_comments=1 ou /blog/posts/2008/?sort_by=date&direction=desc
  • pour créer des URL conviviales, évitez d’utiliser des numéros d’identification et utilisez par exemple dates, catégories et / ou limaces: /blog/post/2008/09/30/django-urls/

Utilisation de GET

request.GET["id"]

Utilisation du POST

request.POST["id"]
def some_view(request, *args, **kwargs):
    if kwargs.get('q', None):
        # Do something here ..

Je voudrais partager un conseil qui pourrait vous faire gagner du temps.
Si vous envisagez d'utiliser quelque chose comme ceci dans votre fichier urls.py :

url(r'^(?P<username>\w+)/

Ce qui signifie fondamentalement www.example.com/<nomutilisateur> . Assurez-vous de le placer à la fin de vos entrées d'URL, car sinon, il est susceptible de provoquer des conflits avec les entrées d'URL ci-dessous, c'est-à-dire qu'en accédant à l'un d'eux , vous obtiendrez la belle erreur: < code> La requête de correspondance d'utilisateur n'existe pas.

Je viens de faire l'expérience moi-même; espérons que cela aide!

, views.profile_page,),

Ce qui signifie fondamentalement www.example.com/<nomutilisateur> . Assurez-vous de le placer à la fin de vos entrées d'URL, car sinon, il est susceptible de provoquer des conflits avec les entrées d'URL ci-dessous, c'est-à-dire qu'en accédant à l'un d'eux , vous obtiendrez la belle erreur: < code> La requête de correspondance d'utilisateur n'existe pas.

Je viens de faire l'expérience moi-même; espérons que cela aide!

Dans les cas où vous ne disposez que de l'objet request , vous pouvez utiliser request.parser_context ['kwargs'] ['your_param']

Vous avez deux façons courantes de le faire si votre URL ressemble à ceci:

https://domain/method/?a=x&b=y

v1:

Si une clé spécifique est obligatoire, vous pouvez utiliser:

key_a = request.GET['a']

Ceci retournera la valeur a si la clé existe et une exception si ce n'est pas le cas.

v2:

Si vos clés sont facultatives:

request.GET.get('a')

Vous pouvez essayer cela sans aucun argument, cela ne plantera pas. Vous pouvez donc l’envelopper avec try: except: et renvoyer HttpResponseBadRequest () dans l’exemple. C'est un moyen simple de rendre votre code moins complexe, sans utiliser la gestion des exceptions spéciale.

Ce n'est pas exactement ce que vous avez demandé, mais cet extrait est utile pour gérer < code> chaîne_interrogation dans modèles .

Je voudrais ajouter une option de moi-même, ici. Quelqu'un se demanderait comment définir le chemin dans urls.py, tel que

domain/search/?q=CA

afin que nous puissions appeler une requête.

Le fait est qu'il n'est PAS nécessaire de définir une telle route dans urls.py. Ce que vous devez définir est simplement la route dans urls.py

urlpatterns = [
    path('domain/search/', views.CityListView.as_view()),
]

et lorsque vous entrez http: // nom_serveur: port / domaine / recherche /? q = CA . La partie de la requête '? Q = CA' sera automatiquement réservée dans la table de hachage à laquelle vous pourrez vous référer si

request.GET.get('q', None).

Voici un exemple (views.py)

class CityListView(generics.ListAPIView):
    serializer_class = CityNameSerializer

    def get_queryset(self):
        if self.request.method == 'GET':
            queryset = City.objects.all()
            state_name = self.request.GET.get('q', None)
            if state_name is not None:
                queryset = queryset.filter(state__name=state_name)
            return queryset

De plus, lorsque vous écrivez une chaîne de requête dans l'URL

http://servername:port/domain/search/?q=CA

Ne mettez pas la chaîne de requête entre guillemets, par exemple

http://servername:port/domain/search/?q="CA"
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top