Hello Baxter!

Take a look at my approach. It might help you. The following template
tag "load_obj" loads any object by id and saves passes it to the
template context variable:

# ---- code starts here ----
from django.db.models import get_model
from django import template

register = template.Library()

def do_load_obj(parser, token):
    try:
        # split_contents() knows not to split quoted strings.
        tag_name, appmodel, object_id, str_as, var_name = token.split_contents()
    except ValueError:
        raise template.TemplateSyntaxError, "%r tag requires a
following syntax: {%% %r app.model <object_id> as <var_name> %%}" %
(token.contents[0], token.contents[0])
    try:
        appname, modelname = appmodel.split(".")
    except ValueError:
        raise template.TemplateSyntaxError, "%r tag requires
application name and model name separated by a dot" %
(token.contents[0], token.contents[0])
    from django.conf import settings
    model = get_model(appname, modelname)
    return LoadObjNode(model, object_id, var_name)

class LoadObjNode(template.Node):
    """ {% load_obj app.name <object_id> as <var_name> %} """
    def __init__(self, model, object_id, var_name):
        self.model = model
        self.object_id = object_id
        self.var_name = var_name
    def render(self, context):
        try:
            object_id = template.resolve_variable(self.object_id, context)
            obj = self.model.objects.get(pk=object_id)
        except ValueError:
            obj = None

        context[self.var_name] = obj
        return ''

register.tag('load_obj', do_load_obj)

# ---- code ends here ----

I think, this is a good example of both -- reading a value of a
variable in a template tag and also setting a value to the context
variable.

Regards,
Aidas Bendoraitis aka Archatas


On 2/9/07, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote:
>
> I need to pass a user id to a template tag.
> After reading this: http://groups.google.com/group/django-users/
> browse_thread/thread/96fe34b4561415dc/b7aba25f22bdd261?
> lnk=gst&q=template+tags+variable&rnum=1#b7aba25f22bdd261
>
> I came up with:
>
> class SongListNode(template.Node):
>     def __init__(self, artist, varname):
>         self.artist, self.varname  = artist, varname
>
>     def __repr__(self):
>         return "<Song Node>"
>
>     def render(self, context):
>         artist=self.artist.resolve(context)
>         context[self.varname] = Song.objects.filter(artist=artist)
>         #context[self.varname] = [self.artist]
>         return ''
>
> class DoGetSongList:
>     """
>     {% get_song_list as song_list %}
>     """
>     def __init__(self, tag_name):
>         self.tag_name = tag_name
>
>     def __call__(self, parser, token):
>         bits = token.contents.split()
>         if len(bits) != 4:
>             raise template.TemplateSyntaxError, "'%s' tag takes three
> arguments" % bits[0]
>         if bits[2] != "as":
>             raise template.TemplateSyntaxError, "second argument to
> '%s' tag must be 'as'" % bits[0]
>         #return SongListNode(bits[1], bits[3])
>         return SongListNode(parser.compile_filter(bits[0]), bits[3])
> register.tag('get_song_list', DoGetSongList('get_song_list'))
>
>
> But no love. Suggestions?
>
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
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 [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to