Thursday, November 8, 2012

Re: Custom template tag problem: "No module named models"

I had the same issue, fixed it with a variation on Jim D.'s solution.

import bookmarks

then bookmarks.models.Bookmark.objects.filter(...)

On Tuesday, October 14, 2008 11:38:20 PM UTC-7, Chris Amico wrote:
I have a simple bookmarks model based on the one in James Bennett's <a
href="http://code.google.com/p/cab/source/browse/trunk/models.py?
r=130
">Cab</a> application. I'm using a generic relation so it can
live in its own app and a user can bookmark any object on the site
(I'm planning on reusing this app on a couple projects). I'm running
into a problem creating an {% if_bookmarked %} template tag.

When I load the tag library I get this error: 'bookmarks' is not a
valid tag library: Could not load template library from
django.templatetags.bookmarks, No module named models

Here's what the tag module looks like:

from django import template
from django.contrib.contenttypes.models import ContentType
from bookmarks.models import Bookmark


class IfBookmarkedNode(template.Node):
    def __init__(self, user, obj, nodelist_true, nodelist_false):
        self.nodelist_true = nodelist_true
        self.nodelist_false = nodelist_false
        self.user_id = template.Variable(user_id)
        self.obj = template.Variable(obj)

    def render(self, context):
        try:
            self.user_id = template.resolve_variable(self.user_id,
context)
            self.obj = template.resolve_variable(self.obj, context)
        except template.VariableDoesNotExist:
            return ''
        ctype = ContentType.objects.get_for_model(obj)
        if Bookmark.objects.filter(content_type=ctype,
object_id=obj.id, user__pk=user_id.id):
            return self.nodelist_true.render(context)
        else:
            return self.nodelist_false.render(context)


def do_if_bookmarked(parser, token):
    bits = token.contents.split()
    if len(bits) != 3:
        raise template.TemplateSyntaxError("'%s' tag takes exactly two
arguments" % bits[0])
    nodelist_true = parser.parse(('else', 'endif_bookmarked'))
    token = parser.next_token()
    if token.contents == 'else':
        nodelist_false = parser.parse(('endif_bookmarked',))
        parser.delete_first_token()
    else:
        nodelist_false = template.NodeList()
    return IfBookmarkedNode(bits[1], bits[2], nodelist_true,
nodelist_false)


And this is the model it should be importing:


class Bookmark(models.Model):
    "A bookmarked item, saved by a user with a timestamp"
    # generic relation
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type',
'object_id')

    # who and when
    user = models.ForeignKey(User)
    timestamp = models.DateTimeField(auto_now_add=True)



The bookmarking model works fine on its own, and I've gotten the
functions in the template tag to work in isolation in the interpreter,
but when I load the tag library it breaks the template. What am I
missing here?

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

0 Comments:

Post a Comment

Subscribe to Post Comments [Atom]

<< Home


Real Estate