我知道已经有一百个,但我有一个应用程序,我做了,有效,还有一个我试图制作的新应用程序,但是没有用。
我无法从我的创建视图重定向到我的'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一样构建它,从小处开始添加。
答案 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原则。