Обработка запроса в теге шаблона включения django - PullRequest
6 голосов
/ 16 июля 2011

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

Я создал следующий тег включения:

<strong>#upload_files.py</strong>

@register.inclusion_tag('upload_form.html')
def upload_handler(context):
    request = context['request']
    view_url = reverse('upload.views.upload_handler')
    if request.method == 'POST':
        form = UploadForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
        return HttpResponseRedirect(view_url)

    upload_url, upload_data = prepare_upload(request, view_url)
    form = UploadForm()

    upload_model_list = UploadModel.objects.all().order_by('-pub_date')

Теперь я хочу включить это в шаблон, поэтому на странице у меня есть:

#mypage.html
{% extends 'base.html' %}
{% load upload_files %}

{% upload_handler %}

Я получаю следующую ошибку:

upload_handler takes 1 arguments

Какой аргумент мне следует передать из шаблона?

1 Ответ

11 голосов
/ 16 июля 2011

Вам нужно добавить takes_context=True при регистрации тега, чтобы django передал объект контекста в функцию:

@register.inclusion_tag('upload_form.html', takes_context=True)

По умолчанию context всегда будет первым аргументом!

Подробнее см. В документации django по тегам включения .

Дополнительное примечание. Тщательно определитесь, на каких страницах вы используете этот тег шаблона, поскольку представление может отображать дополнительные формы / обрабатывать запросы на публикацию определенным образом, что может вступать в противоречие с логикой, предоставляемой вашим тегом (например, проверка формы будет быть вызванным, если страница может быть вызвана почтовым запросом из другой формы). Вы могли бы, например. дополнительно проверьте, если имя какого-либо HTML-элемента указано в request.POST, если у вас есть несколько форм на странице!

...