2011-05-04 21 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