2011-05-04 4 views
3

안녕하세요. 저는 지금이 문제로 고심하고 있습니다. 내 사용자 개체를 템플릿에 전달하여 목록을 표시하거나 사용자 이름을 나열 할 수 있습니다. 지금까지 여기에서 얻은 도움 덕분에 나는 이것을 가지고있다. unhashable 유형 : '목록'을 내 템플릿에Django templatetag 사용자 객체가 포함되었습니다.

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

이 코드를 사용하면 렌더링하는 동안

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) 

나는 형식 오류를 잡힐. 그리고 그것은 특별히 {% get_all_users as allusers %}의 원인입니다. 나는 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

역 추적을 게시하십시오! –

+0

모든 템플릿에 있거나 아니면 하나만 포함해야합니까? – programmersbook

+0

하나 뿐인데, 새 메시지를 작성하기위한 템플릿이며, 거기에 사용자 목록을 갖고 싶습니다. – leffe

답변

3

당신이 만약에게 최신 개발 버전을 사용하고 있습니다. 새로운 태그 바로 가기 assignment tags이 있는데,이 모든 것을 수행합니다. 그럼 당신은 할 수 :

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

하지만 코드와 실제 문제는 당신이 태그 인스턴스에 인수의 전체 목록을 전달하는 것입니다 :

return GetAllUsers(bits) 

그냥 통과한다 변수 이름을 포함 비트 :

return GetAllUsers(bits[2]) 

이 하나의 템플릿의 경우 당신이보기에 그 일을하지 않는 이유 programmersbook 권장 마지막으로,하지만, 내가 이해가 안 돼요.

+0

태그를 사용하도록 권장했기 때문에 render_to_response가 추측됩니다. http://stackoverflow.com/questions/5867451/django-passing- 템플릿 - 목록 - 오브 - 템플리트 ;-) – arie

+0

음, Daniel, 당신은 나에게이 방법을 추천했습니다. Hehe! 내가 여기 물어봤을 때 http://stackoverflow.com/questions/5867451/django-passing-list-of-objects-to-template. 나는 장고 1.3을 가지고있다. 그래도 정말 고마워. – leffe

+0

잘 다니엘 당신의 반환 GetAllUsers (비트 [2]) 그것을 했어. 너는 최고야! 정말 고맙습니다! – leffe

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 url (r 'compose/$', 작성, name = 'messages_compose')을 사용하면 render_to_response를 사용하여 거기에있는 사용자 객체를 얻을 수 있습니까? – leffe

+0

잘 이해했다면 render_to_response가 템플릿을로드하고 구문 분석하고 유효한 HttpResponse 객체를 반환합니다. – programmersbook

관련 문제