Шаблон Django с пользовательскими объектами

#django #django-templates

#django #django-шаблоны

Вопрос:

Я пытаюсь передать пользовательские объекты в мой шаблон через templatetag. Я впервые попробовал simple_tag, но, видимо, это только для строк? В любом случае, это то, что у меня есть до сих пор:

templatetags/profiles.py

 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



class userlist(Node):
    def __init__(self, format_string):
        self.format_string = format_string
    def render(self, context):
        try:
        users = self.format_string
        return users
        except VariableDoesNotExist:
            return None


def get_profiles(parser, token):
    return userlist(User.objects.all())

register = Library()
register.tag('get_profiles', get_profiles)
  

Это то, что у меня есть в моем шаблоне для его тестирования:

 {% load profiles %} 
{% get_profiles %}
{% for p in get_profiles %} {{ p }} {% endfor %}
  

Я получаю только [, , , , ] распечатанный файл или, если я изменяю его User.objects.all() на User.objects.count() , я получаю правильный номер. Итерация for в моем шаблоне, похоже, ничего не делает. что не так?

Комментарии:

1. User.objects.get(username =’test’) также правильно выдает мне пользовательский «test». Просто когда я пытаюсь передать все мои объекты и выполнить итерацию, я ничего не получу с этим циклом for в моем шаблоне.

Ответ №1:

Что такое строка формата? Вам нужно вызвать тег шаблона следующим образом:

 {% get_all_users as allusers %}
{% for user in allusers %}
     {{ user.first_name }}
{% endfor %}
  

Итак, вам нужен тег шаблона, подобный

 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[2])
  

Комментарии:

1. {% get_all_users как allusers %} Это приводит к обнаружению ошибки типа при рендеринге: нехешируемый тип: ‘список’. Я попробовал {% для пользователя в get_all_users %} {{ user }} {% endfor %}. Он не жалуется, но все же ничего не выводит.

2. Спасибо за вашу помощь! Мне пришлось изменить return GetAllUsers (биты) на return GetAllUsers (биты [2]), но в остальном все было безупречно. Еще раз спасибо!