2011-05-04 70 views
3

嘿,我一直在为这个问题苦苦挣扎。我试图将我的用户对象传递给模板,以便我可以列出它们或列出用户名。感谢我从这里得到的帮助,我有这个。Django templatetag包含的用户对象

from django.template import Library, Node, Template, VariableDoesNotExist,  TemplateSyntaxError, \ 
         Variable 
from django.utils.translation import ugettext as _ 
from django.contrib.auth.models import User 
from django.conf import settings 
from django.core.exceptions import ImproperlyConfigured 
from django.db import models 

register = Library() 

class GetAllUsers(Node): 
    def __init__(self, varname): 
     # Save the variable that we will assigning the users to 
     self.varname = varname 
    def render(self, context): 
     # Save all the user objects to the variable and return the context to the template 
     context[self.varname] = User.objects.all() 
     return '' 

@register.tag(name="get_all_users") 
def get_all_users(parser, token): 
    # First break up the arguments that have been passed to the template tag 
    bits = token.contents.split() 
    if len(bits) != 3: 
     raise TemplateSyntaxError, "get_all_users tag takes exactly 2 arguments" 
    if bits[1] != 'as': 
     raise TemplateSyntaxError, "1st argument to get_all_users tag must be 'as'" 
    return GetAllUsers(bits) 

#register.tag('get_all_users', get_all_users) 

当我使用这个代码

 
{% load getusers %} 
{% get_all_users as allusers %} 
{% for user in allusers %} 
    {{ user }} 
{% endfor %} 

在我的模板我被抓了类型错误,而渲染:unhashable类型: '名单'。它是特定的{%get_all_users作为所有用户%}这是造成它。我尝试了{%get_all_users%中的用户},它会通过但不打印任何内容。

回溯

 
Traceback: 
File "/usr/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 
    111.       response = callback(request, *callback_args, **callback_kwargs) 
File "/usr/lib/python2.7/site-packages/django/contrib/auth/decorators.py" in _wrapped_view 
    23.     return view_func(request, *args, **kwargs) 
File "/home/ajunkkil/Django/basedraft/messages/views.py" in compose 
    91.  }, context_instance=RequestContext(request)) 
File "/usr/lib/python2.7/site-packages/django/shortcuts/__init__.py" in render_to_response 
    20.  return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs) 
File "/usr/lib/python2.7/site-packages/django/template/loader.py" in render_to_string 
    188.   return t.render(context_instance) 
File "/usr/lib/python2.7/site-packages/django/template/base.py" in render 
    123.    return self._render(context) 
File "/usr/lib/python2.7/site-packages/django/template/base.py" in _render 
    117.   return self.nodelist.render(context) 
File "/usr/lib/python2.7/site-packages/django/template/base.py" in render 
    744.     bits.append(self.render_node(node, context)) 
File "/usr/lib/python2.7/site-packages/django/template/debug.py" in render_node 
    73.    result = node.render(context) 
File "/usr/lib/python2.7/site-packages/django/template/loader_tags.py" in render 
    127.   return compiled_parent._render(context) 
File "/usr/lib/python2.7/site-packages/django/template/base.py" in _render 
    117.   return self.nodelist.render(context) 
File "/usr/lib/python2.7/site-packages/django/template/base.py" in render 
    744.     bits.append(self.render_node(node, context)) 
File "/usr/lib/python2.7/site-packages/django/template/debug.py" in render_node 
    73.    result = node.render(context) 
File "/usr/lib/python2.7/site-packages/django/template/loader_tags.py" in render 
    127.   return compiled_parent._render(context) 
File "/usr/lib/python2.7/site-packages/django/template/base.py" in _render 
    117.   return self.nodelist.render(context) 
File "/usr/lib/python2.7/site-packages/django/template/base.py" in render 
    744.     bits.append(self.render_node(node, context)) 
File "/usr/lib/python2.7/site-packages/django/template/debug.py" in render_node 
    73.    result = node.render(context) 
File "/usr/lib/python2.7/site-packages/django/template/loader_tags.py" in render 
    64.    result = block.nodelist.render(context) 
File "/usr/lib/python2.7/site-packages/django/template/base.py" in render 
    744.     bits.append(self.render_node(node, context)) 
File "/usr/lib/python2.7/site-packages/django/template/debug.py" in render_node 
    73.    result = node.render(context) 
File "/usr/lib/python2.7/site-packages/django/template/loader_tags.py" in render 
    64.    result = block.nodelist.render(context) 
File "/usr/lib/python2.7/site-packages/django/template/base.py" in render 
    744.     bits.append(self.render_node(node, context)) 
File "/usr/lib/python2.7/site-packages/django/template/debug.py" in render_node 
    73.    result = node.render(context) 
File "/home/ajunkkil/Django/basedraft/messages/templatetags/getusers.py" in render 
    19.   context[self.varname] = User.objects.all() 
File "/usr/lib/python2.7/site-packages/django/template/context.py" in __setitem__ 
    53.   self.dicts[-1][key] = value 

Exception Type: TemplateSyntaxError at /messages/compose/ 
Exception Value: Caught TypeError while rendering: unhashable type: 'list' 
+0

请发布追踪! – 2011-05-04 08:22:34

+0

它必须在所有模板中还是只在一个模板中? – programmersbook 2011-05-04 08:22:45

+0

只是其中之一,它是一个用于撰写新邮件的模板,我希望在那里有用户列表。 – leffe 2011-05-04 08:27:26

回答

3

如果您'使用最新的开发版本,有一个新的标签快捷方式,assignment tags,它可以为你做这一切。然后,你可以只是做:

@register.assignment_tag 
def get_all_users(): 
    return User.objects.all() 

与您的代码,虽然实际的问题是,你的论点整个列表传递给标签实例:

return GetAllUsers(bits) 

时,你应该刚刚路过的包含变量名称位:

return GetAllUsers(bits[2]) 

最后,但是,如果这仅仅是一个模板,我不明白为什么你不认为这样做,因为programmersbook建议。

+0

我猜是因为你推荐使用一个标记:http://stackoverflow.com/questions/5867451/django-passing-列表中的对象到模板;-) – arie 2011-05-04 08:43:17

+0

丹尼尔,你向我推荐这种方式。呵呵!正如我在这里问的http://stackoverflow.com/questions/5867451/django-passing-list-of-objects-to-template。我有Django 1.3所以。尽管我非常感谢你的帮助。 – leffe 2011-05-04 08:45:19

+0

那么丹尼尔你的返回GetAllUsers(bits [2])做到了。你太棒了!非常感谢! – leffe 2011-05-04 08:49:16

0

您是否尝试过使用inclusion tag

据我所知,它似乎坐在丹尼尔提到的simple tagassignment tag之间。这意味着 数据不会像简单标签那样直接输出。并且在assignment tag将数据存储在直接迭代的变量中的情况下,包含标签需要用于呈现数据的模板片段。

@register.inclusion_tag('users.html') 
def show_users(): 
    users = user.objects.all() 
    return {'users': users} 

然后,你可以写一个模板片断(users.html)恰好使您的用户列表中的一部分。

0

当也许是更好地做到这一点在上下文中,看不到一个点,使用标签

观点:

from django.contrib.auth.models import User 
from django.shortcuts    import render_to_response 

def users(request): 
    user_list = User.objects.all() 

    ctx = {'user_list':user_list} 

    render_to_response('temp.html', ctx) 

模板:

{% for user in user_list %} 
    {{ user }} 
{% endfor %} 
+0

http://stackoverflow.com/questions/5867451/django-passing-list-of-objects-to-template。这是我最初试图做的,我无法弄清楚如何让我的用户对象到“撰写”网址并在那里列出。所以当我有url url(r'^ compose/$',compose,name ='messages_compose')时,我可以使用render_to_response来获取那里的用户对象吗? – leffe 2011-05-04 08:41:05

+0

如果我理解你的话,当然,render_to_response会加载并解析模板并返回一个有效的HttpResponse对象 – programmersbook 2011-05-04 08:46:04