2014-11-02 5 views
1

У меня есть куча моделей. Все эти модели имеют метод get_absolute_url и поле text. Я хочу сделать внутренние ссылки в поле text так же, как это делает wikipedia.упоминает/внутренние ссылки в Django

Внутренние ссылки Википедии на страницах относятся только к другим страницам. Мне нужно соединить все мои модели.

Я мог бы создать шаблон для внутренних ссылок и заменить этот шаблон жестко запрограммированным url на url, но это действительно не очень хорошая идея, потому что ссылки могут измениться. Поэтому было бы лучше, если бы я мог ссылаться на get_absolute_url.

Другим вариантом является использование тега шаблона для изменения определенного шаблона на ссылки.

Как это сделать? Существуют ли проекты с открытым исходным кодом, в которых это уже сделано?

+0

Можете ли вы дать один прецедент для вашей цели? я действительно не понимаю, зачем вам это нужно – doniyor

+0

Как твиттер, instagram, facebook и wikipedia. Чтобы указать пользователей на другие страницы и посмотреть, упоминается ли страница где-то еще на странице. – Jamgreen

+0

Почему вы делаете такие сложные вещи? просто используйте именованные URL-адреса, и вы в порядке! – doniyor

ответ

2

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

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

Я также использую Markdown для обработки моих полей описания, поэтому я делаю ссылку возвратной ссылкой с отформатированной в обратном порядке ссылкой вместо HTML, но вы тоже можете настроить ее. Если вы используете Markdown, вы должны сначала поместить этот фильтр.

Так, чтобы отобразить описание TextField с внутренними ссылками, в шаблоне будет что-то вроде этого: (см. В Django docs on writing your own custom filters для получения более подробной информации о написании и регистрирующих фильтров)

{{ entity.description|internal_links|markdown }}

Что касается конкретного фильтра, то я сделал следующее:

from django import template 
from django.core.urlresolvers import reverse 
from my.views import * 

register = template.Library() 

@register.filter 
def internal_links(value): 
    """ 
    Takes a markdown textfield, and filters 
    for internal links in the format: 

    {{film:alien-1979}} 

    ...where "film" is the designation for a link type (model), 
    and "alien-1979" is the slug for a given object 

    NOTE: Process BEFORE markdown, as it will resolve 
    to a markdown-formatted linked name: 

    [Alien](http://opticalpodcast.com/cinedex/film/alien-1979/) 

    :param value: 
    :return: 
    """ 
    try: 
     import re 
     pattern = '{{\S+:\S+}}' 
     p = re.compile(pattern) 
     #replace the captured pattern(s) with the markdown link 
     return p.sub(localurl, value) 
    except: 
     # If the link lookup fails, just display the original text 
     return value 

def localurl(match): 
    string = match.group() 

    # Strip off the {{ and }} 
    string = string[2:-2] 

    # Separate the link type and the slug 
    link_type, link_slug = string.split(":") 
    link_view = '' 

    # figure out what view we need to display 
    # for the link type 
    if(link_type == 'film'): 
     link_view = 'film_detail' 
    elif(link_type == 'person'): 
     link_view = 'person_detail' 
    else: 
     raise Exception("Unknown link type.") 

    link_url = reverse(link_view, args=(link_slug,)) 
    entity = get_object_or_404(Entity, slug=link_slug) 
    markdown_link = "[" + entity.name + "](" + link_url + ")" 

    return markdown_link 
+0

Я также опубликовал [версию на djangosnippets.org] (https://djangosnippets.org/snippets/10420/), которая разрешает внутренние_интеграции внутри ссылок с отформатированной пометкой, а также самостоятельно. – bobtiki

Смежные вопросы