Как я могу извлечь город, регион, страну из URL? Джанго

В настоящее время мое приложение Django обслуживает 7 городов с жестким кодированием и хочет, чтобы все города мира были сохранены не как одно слово типа «Будапешт», а как три уровня, такие как «Нью-Йорк, Нью-Йорк, США».

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

http://localhost:8000/search/?city=New+York%2C+NY%2C+United+States 

Как я могу извлечь значения и сохранить их в своей модели.

Это моя текущая модель города:

 class City(models.Model): name = models.CharField(max_length=128, default="", unique=False) # city name country = models.CharField(max_length=128, default="Scotland") # country name information = models.CharField(max_length=3000, default="") # information about city image = models.ImageField(upload_to='city_images', default=0)#city image slug = models.SlugField(unique=False) # city slug # save function def save(self, *args, **kwargs): self.slug = slugify(self.name) super(City, self).save(*args, **kwargs) def __unicode__(self): return self.name 

Эта строка из моего представления добавляет новый город, если он уже не существует в базе данных:

 city_name = City.objects.get_or_create(slug=city_name_slug, name=city_name_slug) 

Мне бы хотелось, чтобы представление извлекало город, регион, страну и сохраняло их в модели и чтобы слизня была уникальной:

New-York-пу-объединенные состояния

Наконец, это мой взгляд полностью:

 def city(request, city_name_slug): # Create a context dictionary which we can pass to the # template rendering engine. context_dict = {} # if the user is logged in with a profile then status = 2. # else if the user is logged in without a profile then status = 1 # else if the user is not logged in (status = 0) status = navbatlogic(request=request) # to get the profile link in the nav bar # (only viewable when logged + has a profile) slug_of_logged_user = get_profile_slug(request=request) # Can we find a city name slug with the given name? # If we can't, the .get() method raises a DoesNotExist exception. # So the .get() method returns one model instance or raises an exception. city_name = City.objects.get_or_create( slug=city_name_slug, name=city_name_slug) # Get the users registered to this city user_list = User.objects.filter( profile__city=city_name[0]).order_by('-profile__average_rating')[:20] # Add the user list, city name, slug of the logged-in user, and a # status variable to the context dictionary context_dict['users'] = user_list context_dict['city'] = city_name[0] context_dict['slug_of_logged_user'] = slug_of_logged_user context_dict['status'] = status # If p is found in the request, we are searching for people in this city if 'p' in request.GET: q = request.GET.get('p') try: # Look for any user with the search term in their # username, page slug or first and last names user_list = User.objects.filter( Q(username__contains=q) | Q(profile__slug__contains=q) | Q(first_name__contains=q) | Q(last_name__contains=q) ) # Make sure list contains only users registered in this city user_list = user_list.filter(profile__city=city_name) # Re-add list to context dictionary context_dict['users'] = user_list except: pass # If h is found in the request, we are searching for people # with a certain hobby in this city if 'h' in request.GET: q = request.GET.get('h') try: # Look for any user with hobbies similar to the search query user_list = User.objects.filter( profile__hobbies__hobby__contains=q) # Make sure list contains only users registered in this city user_list = user_list.filter(profile__city=city_name) # Re-add list to context dictionary context_dict['users'] = user_list except: pass # If l is found in the request, we are searching for people with # a certain language in this city if 'l' in request.GET: q = request.GET.get('l') try: # Look for any user with languages similar to the search query user_list = User.objects.filter( profile__languages__language__contains=q) # Make sure list contains only users registered in this city user_list = user_list.filter(profile__city=city_name) # Re-add list to context dictionary context_dict['users'] = user_list except: pass return render(request, 'cityProfile.html', context_dict) 

2 Solutions collect form web for “Как я могу извлечь город, регион, страну из URL? Джанго”

Вы можете использовать urlparse для чего-то вроде этого:

 from urllib.parse import urlparse, parse_qs u = urlparse('http://localhost:8000/search/?city=New+York%2C+NY%2C+United+States') q = parse_qs(u.query) city = q['city'] 

Затем вы можете split город, чтобы получить город, штат и страну.

Лучше извлечь эти компоненты из хорошо структурированного источника данных, таких как Google Geocoding Service, чтобы вы могли достоверно рассказать, какая часть данных сопоставляется с административным подразделением. Если вы примете пример из https://developers.google.com/maps/documentation/javascript/examples/geocoding-simple, вы получите объект JSON с 3-уровневой структурой в address_components :

 "address_components" : [ { "long_name" : "New York", "short_name" : "New York", "types" : [ "locality", "political" ] }, { "long_name" : "New York", "short_name" : "NY", "types" : [ "administrative_area_level_1", "political" ] }, { "long_name" : "United States", "short_name" : "US", "types" : [ "country", "political" ] } ] 

Но опять же, будьте осторожны, не во всех местах есть 3 уровня … Попробуйте некоторые крайние случаи и посмотрите, что вы получите (например, Ватикан, Антарктида и т. Д.).

Python - лучший язык программирования в мире.