ошибка из тегов шаблона: у объекта 'str' нет атрибута 'as_widget' - PullRequest
0 голосов
/ 27 апреля 2019

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

У объекта 'str' нет атрибута 'as_widget'

Это код моего тега шаблона:

from django import template
register = template.Library()
@register.filter
def field_type(bound_field):
    return bound_field.field.widget.__class__.__name__


@register.filter
def input_class(bound_field):
    css_class = ''
    if bound_field.form.is_bound:
        if bound_field.errors:
            css_class = 'is-invalid'
        elif field_type(bound_field) != 'PasswordInput':
            css_class = 'is-valid'
    return 'form-control {}'.format(css_class)

и мой шаблон здесь:

{% extends 'board/account.html' %}
{% load widget_tweaks %}
{% load form_tags %}
{% block title %}Sign up{% endblock title %}

{% block content %}
<div class="accountform">
    <form method="POST">
        <h4 class="display-6 text-white p-3">Create your account</h4>
        {% csrf_token %}

        <div class="alert alert-danger p-0" style="border:none;">
            {% for field in form.visible_fields %}
            {% for error in field.errors %}
            <span class="err">{{ error }}</span><br>
            {% endfor %}
            {% endfor %}
        </div>

        <div class="form-group">
            <label for="id_username">Username</label>
            {% render_field form.username|input_class class='form-control' placeholder='John Doe' %}
        </div>

        <div class="form-group">
            <label for="id_email">Email</label>
            {% render_field form.email|input_class class='form-control' placeholder='johndoe@email.com' %}
        </div>

        <div class="row">
            <div class="form-group col-md-6">
                <label for="id_password1">Password</label>
                {% render_field form.password1|input_class class='form-control' placeholder='****' %}
            </div>
            <div class="form-group col-md-6">
                <label for="id_password2">Confirm Password</label>
                {% render_field form.password2|input_class class='form-control' placeholder='****' %}
            </div>
        </div>

        <input type="submit" value="Sign up" class="btn btn-primary btn-block">
        <p class="display-6 bg-signup p-3">Have an account <a href="{% url 'signin' %}">Sign In</a></p>
    </form>
</div>

</div>
{% endblock content %}

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

def signup_view(request):
    if request.method == 'POST':
        form = UserRegistrationForm(request.POST)
        if form.is_valid():
            user = form.save()
            login(request, user)
            return redirect('board:home')
    form = UserRegistrationForm(request.POST)
    return render(request, 'accounts/signup.html', {'form': form})

Пожалуйста, помогите мне решить эту проблему.Спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 27 апреля 2019

Кажется, нет никаких причин для любого из этих тегов шаблона.У django-widget-tweaks уже есть возможность добавить пользовательский класс ошибок с помощью render_field, и вы уже знаете, когда отрисовываете поле пароля, так что вы можете добавить этот класс в случае необходимости.

(Кроме того, django-widget-tweaks уже предоставляет фильтр field_type ).

Итак:

{% with WIDGET_ERROR_CLASS='my_error' %}
    <div class="form-group">
        <label for="id_username">Username</label>
        {% render_field form.username class+='form-control' placeholder='John Doe' %}
    </div>

    <div class="form-group">
        <label for="id_email">Email</label>
        {% render_field form.email class+='form-control' placeholder='johndoe@email.com' %}
    </div>

    <div class="row">
        <div class="form-group col-md-6">
            <label for="id_password1">Password</label>
            {% render_field form.password1| class+='form-control' placeholder='****' %}
        </div>

    ...

{% endwith %}
0 голосов
/ 27 апреля 2019

Вы делаете это неправильно, вы должны добавить calss в атрибуте класса, а не отображать имя класса как поле.Сделай это так.

{% render_field form.username class=form.username|input_class placeholder='John Doe' %}
...