Django templatetag Пользовательские объекты включены - PullRequest
3 голосов
/ 04 мая 2011

Эй, я боролся с этим много сейчас.Я пытаюсь передать свои пользовательские объекты в шаблон, чтобы я мог их перечислить или перечислить имена пользователей.Благодаря помощи, которую я получил отсюда до сих пор, у меня есть это.

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 %}

В моем шаблоне я получаю Caught TypeError при рендеринге:непригодный для печати тип: 'список'.И именно это вызывает {% get_all_users как allusers%}.Я попытался {% для пользователя в get_all_users%}, он проходит, но ничего не печатает.

Traceback

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'

Ответы [ 3 ]

3 голосов
/ 04 мая 2011

Если вы используете последнюю версию разработки, есть новый ярлык тега, теги назначения , который сделает все это за вас. Тогда вы можете просто сделать:

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

Однако реальная проблема с вашим кодом заключается в том, что вы передаете весь список аргументов экземпляру тега:

return GetAllUsers(bits)

когда вы просто должны передать бит, содержащий имя переменной:

return GetAllUsers(bits[2])

Наконец, однако, если это только для одного шаблона, я не понимаю, почему вы не делаете это в представлении, как рекомендует программист.

0 голосов
/ 04 мая 2011

Когда, возможно, лучше сделать это по контексту, не вижу смысла использовать тег

вид:

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 голосов
/ 04 мая 2011

Вы пытались использовать inclusion tag?

Из того, что я понимаю, кажется, что он находится между simple tag и assignment tag Даниэлем. Это означает данные не выводятся напрямую, как это делают простые теги. И если assignment tag хранит данные в переменной, с которой вы напрямую перебираете теги включения, необходим фрагмент шаблона для рендеринга данных.

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

Затем вы можете написать фрагмент шаблона (users.html), который точно отображает вашу часть списка пользователей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...