找不到页面 (404) - 找不到与查询匹配的可用性



我在模板中调用更新和删除视图时找不到页面 (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 中寻找一个pkkwarg 来获取对象,但你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

最新更新