我在模板中调用更新和删除视图时找不到页面 (404(。
我的模型是这样,多个员工可以有多个可用性条目。因此,我创建了一个视图来列出每个员工的可用性条目,我认为使用同时使用员工 pk 和可用性条目的 pk 的 URL 模式是有意义的,以便删除或更新员工的特定可用性条目。
示例:要编辑员工 #2 的可用性条目 #4,请执行以下操作: http://127.0.0.1:8000/staff/2/availability/4/edit
任何线索为什么我会收到此错误?
我做了一些研究,我想知道我是否必须覆盖AvailabilityUpdateView和AvailabilityDeleteView中的get_object方法?
urls.py
path('staff/availability/new/', views.AvailabilityCreateView.as_view(), name='availability_new'),
path('staff/<int:pk>/availability/', views.AvailabilityListView.as_view(), name='availability_list'),
path('staff/<int:pk>/availability/<int:pk_alt>/edit/', views.AvailabilityUpdateView.as_view(), name='availability_edit'),
path('staff/<int:pk>/availability/<int:pk_alt>/delete/', views.AvailabilityDeleteView.as_view(), name='availability_delete'),
模板
<a href="{% url 'availability_edit' pk_alt=availability.pk pk=availability.staff.pk %}">Edit</a> |
<a href="{% url 'availability_delete' pk_alt=availability.pk pk=availability.staff.pk %}">Delete</a>
视图
class AvailabilityUpdateView(UpdateView):
template_name = 'crm/availability_form.html'
form_class = AvailabilityForm
model = Availability
class AvailabilityDeleteView(UpdateView):
template_name = 'crm/availability_confirm_delete.html'
model = Availability
success_url = reverse_lazy('staff_list')
这里的问题是,默认情况下,django 在你的 url 中寻找一个pk
kwarg 来获取对象,但你pk_alt
它作为可用性的 pk 发送; 只需更改视图中的pk_url_kwarg
:
class AvailabilityUpdateView(UpdateView):
template_name = 'crm/availability_form.html'
form_class = AvailabilityForm
model = Availability
pk_url_kwarg = 'pk_alt'
class AvailabilityDeleteView(DeleteView): # <-- shouldn't it be DeleteView?
template_name = 'crm/availability_confirm_delete.html'
model = Availability
success_url = reverse_lazy('staff_list')
pk_url_kwarg = 'pk_alt'
尽管在您的情况下,您似乎希望阻止员工编辑其他员工的可用性,因此最好覆盖get_object
方法来控制它:
class AvailabilityUpdateView(UpdateView):
template_name = 'crm/availability_form.html'
form_class = AvailabilityForm
model = Availability
def get_object(self):
return Availability.objects.get_object_or_404(pk=self.request.GET.get('pk_alt'), staff_id=self.request.GET.get('pk')) # or request.POST
class AvailabilityDeleteView(DeleteView): # <-- shouldn't it be DeleteView?
template_name = 'crm/availability_confirm_delete.html'
model = Availability
success_url = reverse_lazy('staff_list')
def get_object(self):
return Availability.objects.get_object_or_404(pk=self.request.GET.get('pk_alt'), staff_id=self.request.GET.get('pk')) # or request.POST