Django 2 - реверс для просмотра не найден - PullRequest
0 голосов
/ 25 апреля 2018

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

Я могуне перенаправить на мой 'detail' вид из моего представления создания.Если я вставлю число в адрес, это сработает, просто переадресация не сработает.Я попробовал пару вещей безрезультатно.Я уверен, что это что-то простое, я просто не вижу этого.

urls.py

from django.urls import path

from . import views
app_name = 'service'
urlpatterns = [
        path('', views.create_employee_profile,    
            name='create_employee_profile'),
        path('<int:pk>/', views.customer_employee_profile_detail,
            name='detail'),
]

view.py

from django.shortcuts import render, redirect

from service.forms import EmployeeNameForm

def create_employee_profile(request):

    if request.POST:
        name_form = EmployeeNameForm(request.POST)

        if name_form.is_valid():
            new_name_form = name_form.save()
            return redirect('service:detail', pk=new_name_form.pk)

        else:
            return render(request, 'service/create_or_update_profile.html',
                        {'name_form': name_form})

    else:
        name_form = EmployeeNameForm()
        return render(request, 'service/create_or_update_profile.html',
                        {'name_form': name_form})

def customer_employee_profile_detail(request, pk):
    name = get_object_or_404(CustomerEmployeeName, pk=pk)
    return render(request,
                    'service/customer_employee_profile_detail.html', 
                    {'name': name}
                )

У меня естьпробовал как 'detail', так и 'service: detail'.Ошибка: Reverse for 'detail' not found. 'detail' is not a valid view function or pattern name.

Шаблон

{% extends 'base.html' %}

{% block content %}
    <form method="post" action="">
        {% csrf_token %}

        <!--Content Header Bar-->
        <nav class="navbar navbar-light bg-light">
            <span class="navbar-brand mb-0 h1">Name and Address</span>
        </nav>
        <div class="form-group">
            {% include 'service/name_form_template.html' %}
        </div>
        <button type="submit" class="btn btn-primary" style="background-color: SteelBlue;">
            Save
        </button>
    </form>
{% endblock %}

Включенный шаблон содержит макет.

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

1 Ответ

0 голосов
/ 25 апреля 2018

Функция быстрого вызова redirect может также принимать объект модели в качестве первого аргумента. В этом случае он вызвал бы метод get_absolute_url класса модели. Я бы порекомендовал придерживаться этого подхода, так как он поместил бы логику в модельный класс. Это привело бы к так называемым толстым моделям - узким контроллерам . В Django это были бы скорее толстые модели - худые взгляды .

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

class CustomerEmployeeName(models.Model):
    # fields

    def get_absolute_url(self):
        from django.urls import reverse
        return reverse('service:detail', kwargs={'pk': self.pk})

В ваших представлениях вы можете изменить строку с перенаправлением на:

redirect(new_name_form)

Это в конечном итоге не решит вашу проблему немедленно, поскольку, вероятно, это где-то еще, но, на мой взгляд, это лучший подход. Код можно использовать повторно и следует принципам DRY.

...