Объект «str» не имеет атрибута «relative_url»

Я получаю сообщение об ошибке «У объекта str» нет атрибута «relative_url» при загрузке тега шаблона в трясогузку.

Вот мой код тега:

from django import template
from home.models import *

register = template.Library()

@register.inclusion_tag('home/subscribe_form.html')
def test_vdcristo():
    return {}

Вот мой код шаблона html:

{% load wagtailcore_tags  vdecristo_tags %}
    <form action="{% pageurl page %}" method="POST">
     {% csrf_token %}
    <div class="shop-subscribe bg-color-green margin-bottom-40">
        <div class="container">
                <div class="row">
                    <div class="col-md-8 md-margin-bottom-20">
                            <h2>Subscribase para mantenerse<strong> informado</strong></h2>
                    </div>




                    <div class="col-md-4">
                            <div class="input-group">


                             <input type="text" class="form-control" placeholder="Correo Electronico..." {{ form.subscribase }}>
                                    <span class="input-group-btn">
                                            <button class="btn" type="submit"><i class="fa fa-envelope-o"></i></button>
                                    </span>

                            </div>

                                {{ form.subscribase.errors }}
                        </div>
                </div>
        </div><!--/end container-->
    </div>

 </form>

Если я удалю строку:

<form action="{% pageurl page %}" method="POST">

Содержимое формы загружается, но, конечно, не публикуется. Может ли кто-нибудь помочь мне понять, как это исправить?


person Leo    schedule 23.05.2016    source источник


Ответы (2)


Это не удается, потому что ваш код шаблона ссылается на переменные page и form, но вы не передаете их из своего кода тега. (Ошибка, которую я ожидаю увидеть здесь, будет 'NoneType' object has no attribute 'relative_url' - ваша ошибка предполагает, что вы передаете строку как переменную page.)

Один из возможных способов сделать эту работу:

@register.inclusion_tag('home/subscribe_form.html')
def test_vdcristo():
    # Look up the relevant form page by slug; replace FormPage and 'subscribe-now'
    # as appropriate for your site
    page = FormPage.objects.get(slug='subscribe-now')
    return {
        'page': page,
        'form': page.get_form(),
    }
person gasman    schedule 23.05.2016
comment
Теперь я получаю сообщение об ошибке KeyError в /radio/'request' при загрузке тега test_vdcristo. Любое дополнительное предложение? - person Leo; 24.05.2016
comment
Вам, вероятно, потребуется получить переменную 'request' из контекста родительского шаблона - см. раздел о 'takes_context' в docs.djangoproject.com/en/1.9/howto/custom-template-tags/ - и передайте 'request': context['request'] в списке переменных, которые вы возвращаете . - person gasman; 24.05.2016
comment
передача «запроса»: context['request'] устранила проблему. Спасибо! - person Leo; 24.05.2016

Вы должны использовать

{% url url_name %}

(обратите внимание: URL-адрес, а не pageurl) и иметь URL-адрес с именем page, определенный в URL-адресах.

person Maciej Łukaszewicz    schedule 23.05.2016
comment
Это было бы правильно для Django в целом, но в трясогузке {% pageurl ... %} это подходящий тег для использования, когда вы хотите, чтобы URL-адрес соответствовал объекту страницы трясогузки. - person gasman; 24.05.2016