Захват параметров URL в request.GET

В настоящее время я определяю регулярные выражения для захвата параметров в URL-адресе, как описано в руководстве. Как мне получить доступ к параметрам из URL как части объекта HttpRequest?

Мой HttpRequest.GET в настоящее время возвращает пустой объект QueryDict.

Я хотел бы узнать, как это сделать без библиотеки, чтобы лучше узнать Django.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
509
0
606 653
15
Перейти к ответу Данный вопрос помечен как решенный

Ответы 15

Ответ принят как подходящий

Когда URL-адрес похож на domain/search/?q=haha, вы должны использовать request.GET.get('q', '').

q - это нужный параметр, а '' - значение по умолчанию, если q не найден.

Однако, если вместо этого вы просто настраиваете свой URLconf **, ваши захваты из regex передаются в функцию как аргументы (или именованные аргументы).

Такие как:

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

Тогда в вашем views.py у вас будет

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

Является ли '? Param =' единственным способом распознавания параметров Django? Есть ли способ использовать URLconf с HTTP.GET? Я бы хотел сделать / param / 2.

sutee 30.09.2008 00:37

Проверьте вторую часть моего ответа, касающуюся ваших захватов URLconf и регулярных выражений.

camflan 30.09.2008 00:46

В порядке. Сейчас я использую второй метод. Похоже, это отдельные механизмы, и я пытаюсь их смешать. Спасибо!

sutee 30.09.2008 00:58

Без проблем. используйте request.GET, если вы отправляете форму с помощью GET, используйте request.POST, если вы отправляете форму с помощью POST, и если вы просто хотите настроить URL-адреса на наличие переменных разделов, тогда это аргумент URLconf / view.

camflan 30.09.2008 01:01

А как насчет представлений на основе классов?

User 24.04.2015 00:37

для представлений на основе классов вы можете использовать self.kwargs['parameter']

Royendgel Silberie 30.07.2017 23:12

что, если параметров больше одного? Например, разбивка на страницы с двумя параметрами запроса limit и skip

cegprakash 13.07.2018 18:09

как я могу определить по шаблону наличие параметра запроса? или я должен сделать это в views.py

Akin Hwan 08.01.2019 17:25

@Akin {% if request.GET.the_var_you_want %}

Moha369 14.10.2019 14:21

Это не совсем то, о чем вы просили, но этот фрагмент полезен для управления query_strings в templates.

Чтобы прояснить объяснение камфлана, предположим, что у вас есть

  • правило url(regex=r'^user/(?P<username>\w{1,50})/$', view='views.profile_page')
  • a во входящем запросе для http://domain/user/thaiyoshi/?message=Hi

Правило диспетчера URL-адресов будет перехватывать части URL-адреса путь (здесь "user/thaiyoshi/") и передавать их функции просмотра вместе с объектом запроса.

Строка запроса (здесь message=Hi) анализируется, и параметры сохраняются как QueryDict в request.GET. Дальнейшее сопоставление или обработка параметров HTTP GET не выполняется.

Эта функция просмотра будет использовать обе части, извлеченные из пути URL, и параметр запроса:

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

В качестве примечания вы найдете метод запроса (в данном случае "GET", а для отправленных форм обычно "POST") в request.method. В некоторых случаях полезно проверить, соответствует ли он тому, что вы ожидаете.

Обновлять: При принятии решения о том, следует ли использовать путь URL или параметры запроса для передачи информации, может помочь следующее:

  • используйте URL-путь для однозначной идентификации ресурсов, например /blog/post/15/ (не /blog/posts/?id=15)
  • используйте параметры запроса для изменения способа отображения ресурса, например /blog/post/15/?show_comments=1 или /blog/posts/2008/?sort_by=date&direction=desc
  • чтобы сделать URL-адреса удобными для человека, избегайте использования идентификационных номеров и используйте, например, даты, категории и / или ярлыки: /blog/post/2008/09/30/django-urls/

Это действительно хорошо написанный ответ. Это определенно помогло мне немного лучше понять Django.

Mark 16.01.2012 23:11

как мы можем получить значения всех параметров без упоминания имен

numerah 29.12.2014 13:46

@numerah request.GET - это словарь Python. Вы можете, например, выполнить итерацию через request.GET.items ().

akaihola 13.11.2016 09:16

идеальный ответ.

Jay Geeth 27.02.2017 04:53

какие-либо причины, по которым предпочтительнее следовать привычкам, описанным в обновлении? (когда использовать URL-путь или параметры GET)

m0etaz 22.07.2017 15:50

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

Хочу поделиться советом, который поможет вам сэкономить время. Если вы планируете использовать что-то подобное в своем файле urls.py:

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

Что в основном означает www.example.com/<username>. Обязательно поместите его в конец записей URL-адреса, потому что в противном случае он может вызвать конфликты с записями URL-адреса, которые следуют ниже, т.е. доступ к одной из них воля даст вам приятную ошибку: User matching query does not exist.

Я только что испытал это на себе; Надеюсь, это поможет!

Кроме того, в этом случае вы можете проверить, что имена пользователей не конфликтуют с другими URL-адресами.

DrKaoliN 11.05.2013 21:28

Использование GET

request.GET["id"]

Использование POST

request.POST["id"]

Хотя это работает для существующих ключей, ответы camflan и akaihola использовали .get (), чтобы избежать исключений KeyError в случае отсутствия ключа. Было бы разумно сделать то же самое (например, request.POST.get('id', '')).

vastlysuperiorman 19.08.2015 22:17

Очень короткий и полезный ответ. Спасибо

ExeRhythm 06.08.2020 11:34

В ситуациях, когда у вас есть только объект request, вы можете использовать request.parser_context['kwargs']['your_param']

Именно то, что мне нужно. Спасибо.

user4052054 11.04.2019 22:26

У вас есть два распространенных способа сделать это, если ваш URL-адрес выглядит так:

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

Версия 1:

Если конкретный ключ является обязательным, вы можете использовать:

key_a = request.GET['a']

Это вернет значение a, если ключ существует, и исключение, если нет.

Версия 2:

Если ваши ключи необязательны:

request.GET.get('a')

Вы можете попробовать это без каких-либо аргументов, и это не приведет к сбою. Таким образом, вы можете обернуть его try: except: и вернуть HttpResponseBadRequest() в примере. Это простой способ сделать ваш код менее сложным без использования специальной обработки исключений.

как я могу определить параметр запроса из шаблона?

Akin Hwan 08.01.2019 17:25

Кто-то может задаться вопросом, как задать путь в файле urls.py, например

domain/search/?q=CA

чтобы мы могли вызвать запрос.

Дело в том, что для установки такого маршрута в файле urls.py необходимо нет. Вам нужно установить только маршрут в urls.py:

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

И когда вы вводите http: // servername: port / domain / search /? Q = CA. Часть запроса '? Q = CA' будет автоматически зарезервирована в хеш-таблице, на которую вы можете ссылаться, хотя

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

Вот пример (файл 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

Кроме того, когда вы пишете строку запроса в URL:

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

Не заключайте строку запроса в кавычки. Например,

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

Привет, Эрик! Я новичок в Django. Не могли бы вы пролить больше света на "queryset = queryset.filter (state__name = state_name)". Что означает двойное подчеркивание в state__name.

Subbu 13.12.2018 15:12

Здесь «состояние» - это таблица, а «имя» - это поле в этой таблице. В фильтре Django site_name будет ссылаться на значение поля «name» в таблице «state».

Eric Andrews 04.03.2019 13:26

Эти запросы в настоящее время выполняются двумя способами. Если вы хотите получить доступ к параметрам запроса (GET), вы можете запросить следующее:

http://myserver:port/resource/?status=1
request.query_params.get('status', None) => 1

Если вы хотите получить доступ к параметрам, переданным POST, вам необходимо получить доступ следующим образом:

request.data.get('role', None)

Получив доступ к словарю (QueryDict) с помощью get (), вы можете установить значение по умолчанию. В приведенных выше случаях, если «статус» или «роль» не сообщаются, значения равны «Нет».

Это еще одно альтернативное решение, которое можно реализовать:

В конфигурации URL:

urlpatterns = [path('runreport/<str:queryparams>', views.get)]

В представлениях:

list2 = queryparams.split("&")

Помогло понять, я могу передать int на "<int: some_number>"

Adrian Grygutis 27.08.2020 21:28

Если у вас есть доступ только к объекту представления, вы можете получить параметры, определенные в пути URL, следующим образом:

view.kwargs.get('url_param')

Если у вас есть доступ только к объекту запроса, используйте следующее:

request.resolver_match.kwargs.get('url_param')

Проверено на Django 3.

Вы также можете проверить словарь request.META, чтобы получить доступ ко многим полезным вещам, таким как PATH_INFO, QUERY_STRING

# for example
request.META['QUERY_STRING']

# or to avoid any exceptions provide a fallback

request.META.get('QUERY_STRING', False)

вы сказали, что он возвращает пустой запрос dict

Я думаю, вам нужно настроить свой URL-адрес, чтобы принимать обязательные или необязательные аргументы или kwargs Django предоставил вам всю необходимую мощность с помощью regrex, например:

url(r'^project_config/(?P<product>\w+)/$', views.foo),

подробнее об этом на django-необязательный-url-параметры

Для этого просто введите это в javascript:

function getParams(url) {
    var params = {};
    var parser = document.createElement('a');
    parser.href = url;
    var query = parser.search.substring(1);
    var vars = query.split('&');
    for (var i = 0; i < vars.length; i++) {
        var pair = vars[i].split('=');
        params[pair[0]] = decodeURIComponent(pair[1]);
    }
    return params;
};
var url = window.location.href;
getParams(url);

Если вы не знаете названия параметров и хотите работать со всеми ними, вы можете использовать функции request.GET.keys() или dict(request.GET).

Другие вопросы по теме