Разрешение URL на основе запрашиваемого пространства имен - PullRequest
0 голосов
/ 24 октября 2018

Я создаю веб-сайт, используя DjangoCMS, в котором около 10 экземпляров одного и того же приложения.Эти разные экземпляры будут просто использоваться для обслуживания разных файлов на разных страницах.

Все работает, кроме случаев, когда я перехожу к другому экземпляру приложения и перехожу к подробному представлению, оно возвращается к URL-адресу исходного приложения иnamespace.

Например, перейдя на /university/term-syncc/ и нажав на элемент в списке, вы перенаправляетесь на /marketing/4/ или любой другой идентификатор этого элемента.

Если я перейду к/university/term-syncc/4/ это работает, но я не могу получить этот URL для автоматического разрешения.Я знаю, что это как-то связано с тем, что мой get_absolute_url вызывает пространство имен assets, но как я могу заставить его проверить текущее пространство имен приложения, а затем запустить обратный процесс?

models.py

def get_absolute_url(self):
    return reverse("assets:asset_detail", kwargs={"id": self.id})

HTML

<li>
    <a href="{{obj.get_absolute_url}}">{{ obj.name }} test</a>
</li>

urls.py

url(r'^$', asset_list_view, name="asset_list"),
url(r'^(?P<id>\d+)/$', asset_detail_view, name='asset_detail'),

1 Ответ

0 голосов
/ 26 ноября 2018

Лучшее решение для этого - предоставить модель конфигурации для вашего приложения.Затем он может использовать эту конфигурацию для каждого экземпляра.

pip install aldryn-apphooks-config

Во-первых, документы здесь;http://docs.django -cms.org / ru / latest / how_to / namespaced_apphooks.html # aldryn-apphooks-config

При реализации этого решения ваш метод становится примерно таким;

class Asset(models.Model):

    app_config = AppHookConfigField(
        AssetConfig,
        verbose_name=_('Config'),
        help_text='',
    )

    def get_absolute_url(self):
        """Returns the url for this object."""
        if self.app_config and self.app_config.namespace:
            namespace = '{0}:'.format(self.app_config.namespace)
        else:
            namespace = ''

        return reverse(
            '{0}assets:asset_detail'.format(namespace),
            kwargs={"id": self.id}
        )

Не устанавливая это приложение, вы все равно можете использовать пространство имен для своих приложений, с помощью поля Application instance name на странице дополнительных настроек.Вы можете использовать это вместо этого, но для этого нужно будет передавать args / kwargs.

В вашем представлении или шаблонах вы могли бы сделать request.current_page.application_namespace, чтобы получить пространство имен со страницы, чтобы вы могли использовать его для своих ссылок..

...