Должно ли это идти в логику зрения? - PullRequest
0 голосов
/ 06 декабря 2010

В моей модели Django есть поле, в котором я хочу использовать эталонную логику.Как пример:

This is an example of text in the field.[ref type="quotation" name="Martin" date="2010"]

Когда представлено в окончательной разметке, это представляется как (сокращенный пример):

This is an example of text in the field.<a href="#ref">1</a>
[SNIP]
<ul>
<li><a name="ref1">Martin, 2010</a></li>
</ul>

Итак, по сути, я строю список ссылокперейдите в другой блок {{}} дальше вниз по странице.

Должна ли присутствовать такая логика обработки текста (поэтому я передаю 2 значения в шаблон, 1, который является измененным текстом, и 1, которыйсправочная таблица), или есть еще какой-нибудь Django-esque способ сделать это через фильтры и т. д .?

1 Ответ

1 голос
/ 06 декабря 2010

Если вы на самом деле храните ссылки в текстовом поле, как, например, то, по сути, вы используете простой язык разметки для хранения ссылок.

В таком случае, я думаю, что шаблон будет местом для этого.

К сожалению, я не знаю ни одного способа создания фильтра и записи в контекстную переменную. Поэтому вместо использования фильтра вам придется использовать тег, например:

{% output_with_references article_content myreferencesvar %}

[snip]

<ul>
{% for ref in myreferencesvar %}
<li><a name="{{ ref.id }}">{{ ref.authors }}, {{ ref.year }}</a></li>
{% endif %}
</ul>

Кстати: если - это способ записи в контекст страницы при использовании фильтра, я бы хотел узнать об этом.

Обновление

Чтобы реализовать это, вы должны использовать что-то вроде:

from django.template import Library, Node, TemplateSyntaxError

register = Library()

class OutputWithReferencesNode(Node):
    def __init__(self, input, ref_varnam='references'):
        self.input = input
        self.ref_varnam=ref_varnam

    def render(self, context):
        output = self.input
        references = []
        # process self.input
        context[self.ref_varnam] = references
        return output

@register.tag
def output_with_references(parser, token):
    try:
        fnctn, input, ref_varname = token.split_contents()
    except ValueError:
        raise TemplateSyntaxError, "%s takes the syntax %s text_to_output references_variable_name" % (fnctn,)
    return OutputWithReferencesNode(input, ref_varname)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...