Django, обратный ленивый дает NoReverseMatch

Я пытаюсь обновить одно поле своей модели, я переопределил метод get_success_url в updateview, но он не работает.

class MensajeApropiado(UpdateView):
    model = Mensaje
    form_class = FormMensaje
    template_name = 'foro/msjCensura.html'

    def get_success_url(self):
        return reverse_lazy('mensajes', args=(self.object.tema.id,))

urls.py

from django.contrib.auth.decorators import login_required as LR
url(r'^mensajes/(?P<pk>\d+)/$', ListaMensajes.as_view(),  name="mensajes"),
url(r'^msjcensura/(?P<pk>\d+)/', LR(MensajeApropiado.as_view()), name="censura"),

Это шаблон:

{% extends "base.html" %}
{% load i18n %}


{% block content %}



Fecha en Perú: {% now "m-d-Y" %}

<div>
    <a href="{% url 'home' %}">Foros</a> > <a
        href="{% url 'temas' mensaje.tema.foro.id %}">{{ mensaje.tema.foro.titulo }}</a>
    > <a href="{% url 'mensajes' mensaje.tema.id %}">{{ mensaje.tema.titulo }}</a> > Censura del mensaje
</div>


{% if mensaje.tema.autor.user.id == request.user.id and request.user.is_authenticated %}
    Tema: {{ mensaje.tema.titulo }} - {{ mensaje.tema.fecha|date:"M-d-Y" }}
    - Autor: <a href="{% url 'editar_perfil' request.user.id %}">{{ mensaje.tema.autor }} </a>
{% else %}
    Tema: {{ mensaje.tema.titulo }} - {{ mensaje.tema.fecha|date:"M-d-Y" }}
    - Autor: <a href="{% url 'detalle_usuario' mensaje.autor.id %}">{{ mensaje.autor }} </a>
{% endif %}
<br><br>

<div id="no-more-tables">

    <table style='table-layout:fixed;width:100%' class="col-md-12 table-bordered table-striped table-condensed cf">

        <thead class="cf">
        {% with mensaje.profile_data as pdata %}
            <tr>

                <th style='width: 15%;'>
                    Autor

                </th>
                <th class="celdacontenido" style='width: 85%;'>
                    {{ mensaje.fecha|date:"M, d-Y, h:i a" }}

                </th>
            </tr>
            </thead>
            <tbody>
            <tr>
            <td data-title='Autor'>
            {% if mensaje.autor.id == request.user.id and request.user.is_authenticated %}
                <a href="{% url 'editar_perfil' request.user.id %}"> {{ mensaje.autor }} </a><br>
            {% else %}
                <a href="{% url 'detalle_usuario' mensaje.autor.id %}"> {{ mensaje.autor }} </a><br>
            {% endif %}

            {% if request.user.is_staff %} Administrador<br>
            {% else %}
                Miembro<br>
            {% endif %}

            {% if  pdata.1 %}
                <img border="0" alt="Profile Pic" src="/media/{{ pdata.1 }}"/><br>
            {% else %}
                <img border="0" alt="Profile Pic" src="/media/imagenes/nouserimg.png" height="140" width="140"/><br>
            {% endif %}

            Fecha de registro: <br> {{ mensaje.autor.date_joined|date:"M-d-Y" }} <br>
            Número de mensajes: {{ pdata.0 }}
        {% endwith %}
        </td>
        <td align="justify" class="celdacontenido" data-title='{{ mensaje.fecha|date:"m-d-Y, h:i a" }}'>
            {{ mensaje.contenido }}<br>
        </td>

        </tr>

        </tbody>
    </table>
</div>
<br>
<b>Desmarcando la casilla el mensaje se catalogará como inapropiado, caso contrario al seleccionar
    la casilla, será apropiado.</b> <br><br>

<form method="POST" action="">
    {% csrf_token %}
    Apropiado:
    {{ form.apropiado }}<br><br>
    <input class="btn btn-primary" type="submit" value="Confirmar" id="submit"/>
</form>

{% endblock %}

Когда я нажимаю на

<a href="{% url 'censura' mensaje.id %}" class="apropiado">Marcar como inapropiado</a>

из моего другого шаблона он работает, я без проблем вижу шаблон 'censura', но когда я нажимаю кнопку отправки, он дает NoReverseMatch в /msjcensura/5/

Reverse for 'detalle_usuario' with arguments '('',)' and keyword arguments '{}' not found. 1 pattern(s) tried: ['usuario/(?P<pk>\\d+)/']

at

{% url 'detalle_usuario' mensaje.autor.id %}

Я этого не понимаю, я указал другой вид ("mensajes"), но он идет по тому же шаблону (censura).

Редактировать, у меня был URL-адрес, я забыл ввести его в вопросе, потому что проблема была в перенаправлении, а mensaje.autor.id возвращал «Нет»:

 url(r'^usuario/(?P<pk>\d+)/', LR(DetalleUsuario.as_view()), name="detalle_usuario"),

И вид:

class DetalleUsuario(DetailView):
model = PerfilUsuario
template_name = "foro/detalleUsuario.html"

person silver1991    schedule 23.11.2015    source источник
comment
Либо mensaje.autor, либо mensaje.autor.id равно None. Если вы распечатаете mensaje.autor, что вы получите?   -  person Nathan Villaescusa    schedule 23.11.2015
comment
Я изменил код, я использую два представления: MensajeCensura (запрос, ** kwargs) для отображения шаблона и ConfirmarCensura (запрос) для обновления поля, и теперь это работает, я знаю, что это не решение вопроса, но Мне нужно, чтобы этот проект работал во вторник   -  person silver1991    schedule 23.11.2015
comment
У вас нет detalle_usuario URL   -  person pythad    schedule 23.11.2015
comment
Здравствуйте, я добавил эту информацию   -  person silver1991    schedule 23.11.2015


Ответы (2)


Пытаться

{% url 'detalle_usuario' pk=mensaje.autor.id %}

Это поможет нацелить правильный URL-адрес, поскольку параметр в вашей конфигурации URL-адреса назван. Кроме того, похоже, что mensaje.autor.id это None. Можете ли вы попробовать отладить, что mensaje.autor присутствует и имеет id?

person zsquare    schedule 23.11.2015

reverse() используется в представлениях на основе функций, а reverse lazy() используется в представлениях на основе классов.

Пример:

Вызов обратного функционала django из метода get_success_url().

class MensajeApropiado(UpdateView):
    model = Mensaje
    form_class = FormMensaje
    template_name = 'foro/msjCensura.html'

    def get_success_url(self):
        return reverse('mensajes', args=(self.object.tema.id,))

Вызов из параметра success_url.

class MensajeApropiado(UpdateView):
    model = Mensaje
    form_class = FormMensaje
    template_name = 'foro/msjCensura.html'
    success_url = reverse_lazy('mensajes', args=(self.object.tema.id,))

Это связано с тем, что атрибуты класса оцениваются при импорте, reverse_lazy() обрабатывает процесс загрузки при импорте из представления на основе класса, а reverse() — из метода представления на основе класса или представления на основе функции. Ответ на вопрос, когда и как именно это происходит, находится в глубинах системы импорта Python.

См. также этот ответ: Разница между reverse() и reverse_lazy() в Django

person ikenna managwu    schedule 26.04.2020