首页 > 解决方案 > 找不到页面 (404) - 找不到与查询匹配的可用性

问题描述

在我的模板中调用更新和删除视图时,我得到了一个找不到页面 (404)。

我的模型是这样一种方式,即多个员工可以有多个可用性条目。因此,我创建了一个视图来列出每个员工的可用性条目,并且我认为使用同时使用员工的 pk 和可用性条目的 pk 的 URL 模式来删除或更新员工的特定可用性条目是有意义的。

示例:编辑员工 #2 的可用性条目 #4:http: //127.0.0.1 :8000/staff/2/availability/4/edit

任何线索为什么我会收到此错误?

我做了一些研究,我想知道是否必须覆盖 AvailabilityUpdateView 和 AvailabilityDeleteView 中的 get_object 方法?

网址.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')

标签: pythondjango

解决方案


这里的问题是,默认情况下,djangopk在你的 url 中寻找一个 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

推荐阅读