Пользовательский тег шаблона Django для поиска строкового имени пользователя и возврата его в качестве объекта пользователя - PullRequest
0 голосов
/ 06 января 2010

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

{% for user in gr.user.foll.list %}

 {{user}}

Проблема в том, что {{user}} возвращается в виде строки - мне нужно преобразовать в пользовательский объект Django, если он существует в DB Django, или установить переменную unRegistered, если нет, то я могу сделать что-то вроде:

 { user.get_profile.about }} # get profile information

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

{% webapp_user_lookup user %} # my custom tag
    {% ifnot unRegistered %}
    {{ user.get_profile.about }} # get profile information - would fail with a string
    {% endifnot %}
 {% endfor %}

Код, который я использую в другом месте для поиска пользователя в представлении:

try:
        user = User.objects.get(username__iexact=user)
        unRegistered = False
        if not other_user.is_active:
                unRegistered = True
 except: 
        unRegistered = True

Однако, глядя на примеры тегов Django Template, у меня возникают проблемы с пониманием того, как лучше структурировать пользовательский тег шаблона, взять мое строковое имя пользователя - и отправить результаты обратно в виде объекта, если они существуют, или установить переменную, если нет и оригинальная строка. Я действительно хотел бы лучше понять, как работает структура, и если мне нужен «класс», и если да, то почему. (Я новичок в программировании).

1 Ответ

3 голосов
/ 06 января 2010

используйте шаблонный фильтр так:

{{username|get_user}}

в вашем user_template_tags.py:

from django import template
from django.contrib.auth.models import User

register = template.Library()

########################

def get_user(username):
    try:
        user = User.objects.get(username__iexact=username)
    except User.DoesNotExist: 
        user = User.objects.none()
    return user

register.filter('get_user',get_user)

тогда в вашем шаблоне вы можете сделать что-то вроде:

{% with username|getuser as user %}
{% if user %}DO USER STUFF
{% else %}DO UNREGISTERED STUFF
{% endif %}
{% endwith %}
...