Создание карты сайта Django без учета моделей? - PullRequest
1 голос
/ 29 марта 2019

Все примеры, которые я видел для создания файлов сайтов в Django, похоже, повторяют модель, чтобы генерировать URL-адреса таким образом.

Например, из документации Django:

class BlogSitemap(Sitemap):
    changefreq = "never"
    priority = 0.5

    def items(self):
        return Entry.objects.filter(is_draft=False)

    def lastmod(self, obj):
        return obj.pub_date

Я не могу сделать это с моим веб-приложением. У меня есть тысячи URL-адресов, соответствующих страницам продуктов, которые создаются с использованием django на основе данных, полученных из API, который был непосредственно вставлен в базу данных postgres.

Итак, я использую django для извлечения записей из базы данных и формирования их представления, но имеющиеся у меня URL-адреса не соответствуют какой-либо модели django (это то, что будет улучшено и изменено в будущем).

Есть ли способ указать конкретные URL-адреса в карте сайта без итерации по модели?

1 Ответ

1 голос
/ 29 марта 2019

items() может вернуть любой объект Python, это не обязательно должна быть модель Django. По умолчанию каждый объект передается методу location, который должен возвращать URL-адрес объекта (в модели Django он использует метод get_absolute_url()).

Таким образом, в основном, если у вас есть класс python, который определяет каждую «страницу», которую вы хотите показать в вашей карте сайта (это может быть просто строка или кортеж строк), и вы определяете метод, который возвращает URL на этой странице вам просто нужно вызвать этот метод в location(), чтобы переопределить поведение по умолчанию.

items также может быть просто списком строк, которые вы бы использовали в пути URL. Тогда location() будет использовать reverse() с каждой из этих строк. Скажем, например, URL вашей страницы продукта использует регулярное выражение, как это:

path('products/<str:category>/<str:name>', name='product')

и в items() вы возвращаете список словарей:

return [{'category': cat, 'name': name} for cat, name in product_searches]

тогда ваша location(item) функция должна будет вернуть:

return reverse('product', kwargs={'category': item.category, 'name': item.name}) 

Подробнее см. В документах

...