Django 2 - 反向找不到视图

时间:2018-04-25 10:19:22

标签: django django-views

我知道已经有一百个,但我有一个应用程序,我做了,有效,还有一个我试图制作的新应用程序,但是没有用。

我无法从我的创建视图重定向到我的'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 %}

包含的模板保存布局。

我没有使用通用视图的原因是因为这些视图最终将包含多个表单。我正在尝试像legos一样构建它,从小处开始添加。

1 个答案:

答案 0 :(得分:1)

快捷函数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原则。