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





Когда 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
Проверьте вторую часть моего ответа, касающуюся ваших захватов URLconf и регулярных выражений.
В порядке. Сейчас я использую второй метод. Похоже, это отдельные механизмы, и я пытаюсь их смешать. Спасибо!
Без проблем. используйте request.GET, если вы отправляете форму с помощью GET, используйте request.POST, если вы отправляете форму с помощью POST, и если вы просто хотите настроить URL-адреса на наличие переменных разделов, тогда это аргумент URLconf / view.
А как насчет представлений на основе классов?
для представлений на основе классов вы можете использовать self.kwargs['parameter']
что, если параметров больше одного? Например, разбивка на страницы с двумя параметрами запроса limit и skip
как я могу определить по шаблону наличие параметра запроса? или я должен сделать это в views.py
@Akin {% if request.GET.the_var_you_want %}
Это не совсем то, о чем вы просили, но этот фрагмент полезен для управления query_strings в templates.
Чтобы прояснить объяснение камфлана, предположим, что у вас есть
url(regex=r'^user/(?P<username>\w{1,50})/$', view='views.profile_page')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 или параметры запроса для передачи информации, может помочь следующее:
/blog/post/15/ (не /blog/posts/?id=15)/blog/post/15/?show_comments=1 или /blog/posts/2008/?sort_by=date&direction=desc/blog/post/2008/09/30/django-urls/Это действительно хорошо написанный ответ. Это определенно помогло мне немного лучше понять Django.
как мы можем получить значения всех параметров без упоминания имен
@numerah request.GET - это словарь Python. Вы можете, например, выполнить итерацию через request.GET.items ().
идеальный ответ.
какие-либо причины, по которым предпочтительнее следовать привычкам, описанным в обновлении? (когда использовать URL-путь или параметры GET)
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-адресами.
Использование GET
request.GET["id"]
Использование POST
request.POST["id"]
Хотя это работает для существующих ключей, ответы camflan и akaihola использовали .get (), чтобы избежать исключений KeyError в случае отсутствия ключа. Было бы разумно сделать то же самое (например, request.POST.get('id', '')).
Очень короткий и полезный ответ. Спасибо
В ситуациях, когда у вас есть только объект request, вы можете использовать request.parser_context['kwargs']['your_param']
Именно то, что мне нужно. Спасибо.
У вас есть два распространенных способа сделать это, если ваш URL-адрес выглядит так:
https://domain/method/?a=x&b=y
Версия 1:
Если конкретный ключ является обязательным, вы можете использовать:
key_a = request.GET['a']
Это вернет значение a, если ключ существует, и исключение, если нет.
Версия 2:
Если ваши ключи необязательны:
request.GET.get('a')
Вы можете попробовать это без каких-либо аргументов, и это не приведет к сбою.
Таким образом, вы можете обернуть его try: except: и вернуть HttpResponseBadRequest() в примере.
Это простой способ сделать ваш код менее сложным без использования специальной обработки исключений.
как я могу определить параметр запроса из шаблона?
Кто-то может задаться вопросом, как задать путь в файле 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.
Здесь «состояние» - это таблица, а «имя» - это поле в этой таблице. В фильтре Django site_name будет ссылаться на значение поля «name» в таблице «state».
Эти запросы в настоящее время выполняются двумя способами. Если вы хотите получить доступ к параметрам запроса (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>"
Если у вас есть доступ только к объекту представления, вы можете получить параметры, определенные в пути 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).
Является ли '? Param =' единственным способом распознавания параметров Django? Есть ли способ использовать URLconf с HTTP.GET? Я бы хотел сделать / param / 2.