Django - Отображение тега включения из представления - PullRequest
14 голосов
/ 18 августа 2010

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

Страница является обычной страницей со списком элементов. Список элементов отображается с использованием тега включения. Если к представлению сделан ajax-запрос, я хочу вернуть только то, что вернул бы тег включения, чтобы я мог добавить его на страницу с помощью javascript. Возможно ли что-то подобное? Или мне лучше это спроектировать?

Ответы [ 6 ]

2 голосов
/ 25 октября 2011

Это звучит как работа для ярлыков render_to_string или render_to_response:
https://docs.djangoproject.com/en/dev/ref/templates/api/#the-render-to-string-shortcut
https://docs.djangoproject.com/en/dev/topics/http/shortcuts/#django.shortcuts.render_to_response

Мы все еще можем использовать тег включения для генерации подсказки контекста шаблона из наших аргументов (как подсказывает @ BobStein-VisiBone в комментариях)

from django.template.loader import render_to_string
from django.shortcuts import render_to_response

from .templatetags import my_inclusion_tag


rendered = render_to_string('my_include.html', my_inclusion_tag(foo='bar'))

#or

def my_view(request):
    if request.is_ajax():
        return render_to_response('my_include.html',
                      my_inclusion_tag(foo='bar'),
                      context_instance=RequestContext(request))
1 голос
/ 30 июня 2011

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

def render_templatetag(request, tag_string, tag_file, dictionary=None):
    dictionary = dictionary or {}
    context_instance = RequestContext(request)
    context_instance.update(dictionary)
    t = Template("{%% load %s %%}{%% %s %%}" % (tag_file, tag_string))
    return t.render(context_instance)

tag_string - это вызов тега шаблона, как он выглядит в обычном шаблоне, а tag_file - файл, который необходимо загрузить для тега шаблона.

0 голосов
/ 18 мая 2017

Это возможно, но, вероятно, немного хакерски, сложно или сложно.

Я хотел бы предложить создать его так, чтобы у вас была часть рендеринга в функции utils.py и использовать ее в simple_tag вместоinclusion_tag.Таким образом, вы можете легко использовать ту же функцию рендеринга утилит в представлениях.

В моем (очень упрощенном) воображаемом примере у меня есть список пользователей и кнопка «Загрузить еще», которая возвращает больше пользователей.

account / utils.py

from django.template.loader import render_to_string


def render_users(users):
    return render_to_string("account/user_list_items.html", {"users": users})

account / templatetags / account_tags.py

from django import template

from ..utils import render_users

register = template.Library()


@register.simple_tag
def list_users(users):
    return render_users(users)

account / views.py

from django.http import HttpResponse

from .models import User
from .utils import render_users


def load_more_users(request):
    limit = request.GET["limit"]
    offset = request.GET["offset"]
    users = User.objects.all()[offset:offset + limit]
    return HttpResponse(render_users(users))

Простое лучше, чем сложное.

0 голосов
/ 31 марта 2012

Используя тег включения с настраиваемым декоратором шаблонов, предоставляемым Gonz вместо стандартных тегов включения Django, вы можете написать помощника в своем представлении:

from django.template.loader import render_to_string
from home.templatetags.objectwidgets import object_widget

def _object_widget(request, obj):
    template, context = object_widget(RequestContext(request), obj)
    return render_to_string(template, context)

Это СУХОЙ и работает с Django 1.3(Я не тестировал его с Django 1.4).

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

0 голосов
/ 18 августа 2010

Быстрым и грязным способом может быть представление, которое отображает шаблон, который содержит только ваш тег шаблона.

0 голосов
/ 18 августа 2010

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

С другой стороны, ответы AJAX обычно содержат не столько HTML, сколько XML / JSON. Если вы используете шаблонные функции Django, вам лучше вернуть HTML. Если нет, XML / JSON может иметь больше смысла. Просто мои два цента.

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