@Forxxx

Формирование произвольных URL?

Есть модели:

Страны:
	name
	slug
	
Города:
	name
	slug
	ForeignKey(Страна)

Улицы:
	name
	slug
	ForeignKey(Город)
	
Дома:
	name
	slug
	ForeignKey(Улица)


Задача реализовать формирование URL по следующему принципу:
/<страна>
/<страна>/<город>
/<страна>/<город>/<улица>
/<страна>/<город>/<улица>/<дом>


На текущий момент пока дошел только до такой идеи:

urlpatterns = [
    path('<slug:country>', views.CountryView.as_view(), name='country'),
    path('<country>/<slug:city>', views.CityView.as_view(), name='city'),
    path('<country>/<city>/<slug:street>', views.StreetView.as_view(), name='street')
]


Создать отдельную таблицу с FullURL и проверять по ней request.path

class CountryView(View):	
    def get(self, request, country):
		# Тут проверить request.path на существование
        return render(request, 'main/country.html')
		
class CityView(View):
    def get(self, request, country, city):
		# Тут проверить request.path на существование
        return render(request, 'main/city.html')

class StreetView(View):
    def get(self, request, country, street):
		# Тут проверить request.path на существование
        return render(request, 'main/street.html')


Хочу понять насколько правильно я двигаюсь или есть более верный и грамотный вариант?
Много всего гуглил и от обилия информации боюсь запутаться еще больше

В Yii2 аналогичная задача была реализована написанием своих функций разбора и формирования URL.
Есть отдельная таблица (SeoURL) в которой хранится список всех URL:

Контроллер | ID записи | Полный URL

На входе по полному URL запрашиваем имя контроллера и ID для передачи соответствующему контроллеру, на выходе запрашиваем полный URL для браузера. Если запись отсутствует = 404
  • Вопрос задан
  • 71 просмотр
Пригласить эксперта
Ответы на вопрос 1
trapwalker
@trapwalker
Программист, энтузиаст
Джанго также отлично позволяет обрабатывать много урлов одним view. Можно просто зароутить все после слеша и парсить хвост урла как адресную цепочку.

Как правило в таких способах представления адреса нужно стараться избегать отдельных запросов к БД по стране, городу, улице, дому. В идеале нужно доставать всю необходимую информацию за один запрос.
Тут становится важным как устроена ваша БД. Обычно адресные элементы индентифицируются не по названию, ведь название, в данном случае, - это плохой идентификатор. Он с одной стороны громоздкий (Санкт-Петербург), а, с другой, есть проблемы с уникальностью для мелких населенных пунктов. А ещё топонимы чаще всего интенационализируются, то есть на разных языках они пишутся по-разному. Кроме того, адреса в рахных странах могут записываться по-разному, встречаются совершенно разные уровни административного деления, разные схемы подчинения административных единиц.
К примеру, в РФ есть области (автономные области, края), районы, сёла, посёлки городского типа, микрорайоны, да и дома - это не рпосто нумерация, там есть дроби, литеры, корпуса...
Каждй раз когда я вижу, что кто-то пытается такую сложныю предметную область формализовать в виде элементов URL, я срашиваю, а зачем это вообще нужно? URL - это не самая удобная штука для непосредственного ввода человеком. Особенно много вопросов вызовут топонимы с пробелами, дефисами, сокрашениями (С. Петербург, Питер). Для чего всё это? Не проще ли воспользоваться идентификатором адресной единицы от одного из адресных справочников вроде OKATO? Понятно что в разных странах эти справочники разные, но тут в любом случае надо делать разную логику.
Я бы не заморачивался излишней читаемостью урлов в таком вот случае, а просто добавил бы префикс, однозначно указывающий на "домен" адресного пространства, и следом бы указывал идентификатор внутри этого адресного пространства. Вот смотрите сколько их бывает: https://classifikators.ru
К примеру:
/okato/70228870004
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы