python - 找不到页面 (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')
解决方案
这里的问题是,默认情况下,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
推荐阅读
- php - 在多维数组中使用 key=>value 最快搜索超过 300k 的数据数组
- dojo - Dojo:动态附加搜索栏/搜索字段?
- python-3.x - 根据条件从数据框列中汇总计数和值总计
- java - 创建一个自定义映射器,它将使用 DB 中的行,直到 id 更改
- python - Python Itrtools 和多处理
- python - 日期时间未处理 ValueError 异常
- c# - 在 .NET 核心中的函数(同步)期间更新 TextBlock
- java - win7 /32 / java8的打包程序
- python - 如何使用拖放交换 tkinter 网格中的小部件放置?
- mysql - 修改列后的MySQL表数据大小