On Sat, Dec 29, 2012 at 10:26 PM, <samtyg...@gmail.com> wrote:

> Hi,
>
> I am creating a site, and trying to implement a referencing/citation
> system.
>
> I'd like to render something like
> "Lorem ipsum dolor sit amet[[ref:foo2012]], consectetur adipisicing elit,
> sed do eiusmod tempor incididunt[[ref:bar2011]] ut labore et dolore magna
> aliqua."
> stored in a TextField,
> "Lorem ipsum dolor sit amet[1], consectetur adipisicing elit, sed do
> eiusmod tempor incididunt[2] ut labore et dolore magna aliqua."
>
> "[1] foo, 'something something' (2012)
> [2] bar, 'something something' (2011)
> "
> where "foo2012" is the slug of a reference object, that has a title,
> author, data etc.
>
> I have made a filter that can scan though a string, pick out the [[]] tags
> and look up the reference. I can use this in  a template like {{
> site.description|refs }}. However i need somewhere to store mapping of
> numbers to references for that page, so that i can filter multiple blocks
> on the same page without resetting the numbering. I would then use a tag at
> the end of the page, that rendered the collected list.
>
> The docs on custom tags and filters talks about render_context, but does
> not show how to use them with filters (only with tags).
>
> Am i going about this the wrong way? should filters be stateless? i
> realise that parsing relationships out of a text field is not good database
> style, but i can't think of another way to allow editors to put citations
> into text. i would also like to use a similar tag for cross links in the
> text (eg [[site:foo]] -> "/sites/view/foo").
>

What you're describing is just a markup language -- if you look in
django.contrib.markup, you'll find 3 examples of analogous markup
languages. So yes, this is an entirely appropriate way to handle
user-provided content.

As for implementation; filters are generally stateless -- they're really
not much more than a way to access a function in a template. However,
that's got more to do with convention than hard rules. There's nothing that
*requires* them to be stateless. Writing to the context in a filter isn't
prohibited; it's just unusual (which is why the docs don't provide a
specific example). Using one tag to extract references, and a second to
print those references sounds entirely appropriate.

The other approach would be to use a template tag. The only advantage here
would be that tags often have context-modifying side effects, so it would
be marginally less surprising to an outside observer to see a tag modify
context. However, that's really just a developer communication issue -- if
there's enough documentation (formal or informal) about what the pair of
filters are doing, I don't see any reason why you shouldn't use a filter
for this purpose.

Yours,
Russ Magee %-)

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-users@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.

Reply via email to