Ссылка на URL-адреса databrowse в шаблонах

#django #django-templates #django-views

#django #django-шаблоны #django-представления

Вопрос:

Я хотел бы интегрировать django Databrowse в свое приложение.

Это сводится к указанию на URL-адреса databrowse из шаблона или представления для расширенной детализации функциональности databrowse.

Есть ли простой способ извлечь URL-адрес из объекта databrowse?

Комментарии:

1. Databrowse на самом деле ни во что не очень хорошо интегрируется. Честно говоря, это немного заброшенный проект.

Ответ №1:

Что ж, одним из простых способов было бы просто создать нужный URL-адрес и передать его в шаблон:

 databrowse_url = '/'.join((obj._meta.app_label, obj._meta.module_name, 'objects', str(obj.id)))
  

А затем в шаблоне (при условии, что у вас есть databrowse, расположенный по адресу /databrowse :

 <a href="/databrowse/{{ databrowse_url }}">
  

Что дало бы вам URL-адрес, подобный: /databrowse/app_name/model_name/objects/1 .

Комментарии:

1. Нашел способ извлекать URL-адрес непосредственно из databrowse, но мне нравится простота этого.

Ответ №2:

Вы могли бы воссоздать URL-адреса databrowse в формате, который отображается в databrowse urls.py

Возможно, вам удастся заставить тег url работать в вашем шаблоне, передав имя представления аргументы.

Однако, если вы просмотрите исходный код, похоже, что databrowse добавит атрибут ‘url’ к объектам, с которыми он работает.

Редактировать:

Учитывая экземпляр EasyModel, вы можете сделать следующее:

 my_easy_model_instance.url()
  

Большинство «простых» классов имеют для них метод url() или urls().

Комментарии:

1. Есть ли способ извлечь атрибут url из соответствующего объекта ( EasyModel )?

2. @Oleksiy: В вашем экземпляре EasyModel просто вызовите .url(). Я отредактирую ответ, чтобы включить это.

3. и как можно было бы извлечь объект EasyModel из экземпляра класса? Это, кажется, самая сложная часть.

4. опубликовал мою окончательную версию, использующую экземпляр повторно, все еще не совсем то, что я хочу, но это становится ближе. Спасибо за вашу помощь!

Ответ №3:

В итоге я написал класс mixin, который извлекает соответствующий EasyInstance и повторно использует url() его:

 from django.contrib.databrowse.datastructures import EasyModel
from django.contrib.databrowse import site   

class DatabrowseMixin:
     def url(pyClass):
          if not site.root_url:
               #hack, but root_url is not set until the first databrowse view
               #and resolving urlconf does not work either
               site.root_url = '/databrowse/' 

          easy_model = EasyModel(site, pyClass.__class__)
          obj = easy_model.object_by_pk(pyClass.pk)

          return obj.url()

class MyModel(models.Model, DatabrowseMixin):
     ...
  

Теперь в моих шаблонах я могу повторно использовать my_model_instance.url тег, указывающий на URL-адрес объекта databrowse.