[英]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.