Frage

Ich bin die Definition zur Zeit reguläre Ausdrücke, um Parameter in einer URL zu erfassen, wie in der Anleitung beschrieben. Wie kann ich Parameter aus der URL als Teil des HttpRequest Objekt? Mein HttpRequest.GET derzeit gibt ein leeres QueryDict Objekt.

Ich möchte lernen, wie man dies ohne eine Bibliothek zu tun, so kann ich besser kennen zu lernen Django bekommen.

War es hilfreich?

Lösung

Wenn url ist wie: domain/search/?q=haha ,  Dann würden Sie request.GET.get('q', '') verwenden.

q ist der Parameter, den Sie mögen, und '' ist der Standardwert, wenn q nicht gefunden wird.

Wenn Sie jedoch stattdessen Ihre URLconf nur konfigurieren , dann Ihre Aufnahmen aus der regex werden die Funktion als Argumente übergeben (oder benannten Argumente).

Wie zum Beispiel:

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

Dann in Ihrem views.py würden Sie haben

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

Andere Tipps

Um camflan Erklärung zu verdeutlichen, nehmen wir an, Sie haben

  • die Regel url(regex=r'^user/(?P<username>\w{1,50})/$', view='views.profile_page')
  • a in eingehender Anfrage für http://domain/user/thaiyoshi/?message=Hi

Der URL Dispatcher Regel werden Teile der URL fangen Pfad (hier "user/thaiyoshi/") und übergeben sie an die View-Funktion zusammen mit dem Request-Objekt.

Der Abfrage-String (hier message=Hi) wird analysiert und Parameter werden als QueryDict in request.GET gespeichert. Keine weitere Anpassung oder Verarbeitung für HTTP-GET-Parameter erfolgt.

Diese Ansicht Funktion würde beiden Teile aus dem URL-Pfad und Abfrageparameter extrahierten verwenden:

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

Als Seite beachten, werden Sie die Request-Methode finden (in diesem Fall "GET" und für eingereicht Formen in der Regel "POST") in request.method. In manchen Fällen ist es sinnvoll zu prüfen, ob es passt, was Sie erwartet.

Update: Bei der Entscheidung, ob der URL-Weg oder die Abfrageparameter für Informationsvermittlung zu verwenden, können die folgenden helfen:

  • verwenden, um den URL-Pfad zur eindeutigen Identifizierung Ressourcen, z.B. /blog/post/15/ (nicht /blog/posts/?id=15)
  • verwenden Abfrageparameter für die Änderung der Art und Weise die Ressource angezeigt wird, z.B. /blog/post/15/?show_comments=1 oder /blog/posts/2008/?sort_by=date&direction=desc
  • human-freundliche URLs zu machen, vermeidet ID-Nummern und verwendet z.B. Daten, Kategorien und / oder Schnecken: /blog/post/2008/09/30/django-urls/

Mit GET

request.GET["id"]

Mit POST

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

Ich möchte einen Tipp teilen, die Sie Zeit sparen können.
Wenn Sie planen, in Ihrer urls.py Datei, so etwas zu verwenden:

url(r'^(?P<username>\w+)/$', views.profile_page,),

Das bedeutet im Grunde www.example.com/<username>. Seien Sie sicher, dass es am Ende Ihrer URL-Einträge zu platzieren, denn sonst ist es anfällig für die URL-Einträge verursachen Konflikte mit der unten aufgeführten folgen, das heißt einer von ihnen den Zugriff auf geben Sie den schönen Fehler: User matching query does not exist.
Ich habe es einfach selbst erlebt; hoffe, es hilft!

Für Situationen, in denen Sie nur das request Objekt haben Sie request.parser_context['kwargs']['your_param'] verwenden können,

Sie haben zwei gemeinsame Wege, dass Ihre URL zu tun, falls sieht wie folgt aus:

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

v1:

Wenn bestimmte Schlüssel obligatorisch ist, können Sie verwenden:

key_a = request.GET['a']

Dies wird einen Wert von a zurück, wenn Schlüssel vorhanden ist und eine Ausnahme, wenn es nicht.

v2:

Wenn Sie Ihre Schlüssel sind optional:

request.GET.get('a')

Sie können versuchen, dass ohne Argument dies wird nicht abstürzen. So können Sie es mit try: except: wickeln und HttpResponseBadRequest() in Beispiel zurück. Dies ist ein einfacher Weg, um Ihren Code weniger komplex zu machen, ohne Umgang mit speziellen Ausnahmen zu verwenden.

Dies ist nicht genau das, was Sie gefragt, aber dieser Schnipsel ist hilfreich für die Verwaltung von query_strings in templates.

Ich möchte einige Möglichkeit, mich an, hier. Jemand würde sich fragen, wie Pfad in urls.py zu setzen, wie

domain/search/?q=CA

, damit wir Abfrage aufrufen könnte.

Die Tatsache ist, dass es nicht notwendig ist, eine solche Strecke in urls.py. einstellen Was Sie einstellen müssen, ist nur der Weg in urls.py

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

und bei der Eingabe von http: // server: port / Domain / search / q = CA . Die Abfrage Teil ‚? Q = CA‘ automatisch in der Hash-Tabelle reserviert werden, die Sie wenn

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

Hier ist ein Beispiel (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

Darüber hinaus, wenn Sie Query-String in URL schreiben

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

Sie keine Abfrage-String in Anführungszeichen wickeln z

http://servername:port/domain/search/?q="CA"
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top