简体   繁体   English

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

[英]Page not found (404) - No availability found matching the query

I'm getting a Page not found (404) on calling the Update and Delete views in my template.在我的模板中调用 Update 和 Delete 视图时,我得到一个 Page not found (404)。

My models are in such a way that multiple Staff can have multiple Availability entries.我的模型是这样的,即多个 Staff 可以有多个 Availability 条目。 So I created a view to list the availability entries of each staff and I thought it would make sense to use a URL pattern that uses both the staff's pk and the availability entry's pk in order to delete or update the specific availability entries of a staff.因此,我创建了一个视图来列出每个员工的可用性条目,我认为使用同时使用员工 pk 和可用性条目 pk 的 URL 模式来删除或更新员工的特定可用性条目是有意义的。

Example: To edit Staff #2's availability entry #4: http://127.0.0.1:8000/staff/2/availability/4/edit示例:要编辑员工 #2 的可用性条目 #4: http : //127.0.0.1 : 8000/staff/ 2/availability/4/edit

Any clue why I'm getting this error?任何线索为什么我会收到此错误?

I did some research and I'm wondering if I have to override the get_object method in the AvailabilityUpdateView and AvailabilityDeleteView?我做了一些研究,我想知道是否必须覆盖 AvailabilityUpdateView 和 AvailabilityDeleteView 中的 get_object 方法?

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

Template模板

<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>

Views观看次数

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')

The problem here is that, by default, django looks for a pk kwarg in your url to get the object, but you are sending it pk_alt as the availability's pk;这里的问题是,默认情况下,django 在您的 url 中查找pk kwarg 以获取对象,但是您将pk_alt作为可用性的 pk 发送; simply change the pk_url_kwarg in your views:只需更改视图中的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'

Although in your case, it seems like you want to prevent staffs from editing other staff's availability, so it's better to override the get_object method to have control over that:尽管在您的情况下,您似乎希望阻止员工编辑其他员工的可用性,因此最好覆盖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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM