Django应用404错误:Booking查询匹配失败求助
Django UpdateView 404错误:Slug参数名不匹配导致无法找到对象
问题根源
你遇到的404错误核心原因是URL捕获的参数名与视图中读取的参数名不匹配:
- 在
urls.py中,路径定义为<str:slug>,Django会将URL对应部分以键slug存入视图的self.kwargs - 但在
EditBookingView的get_object和get_context_data方法里,你试图读取booking_reference这个不存在的键,导致实际拿到的参数值为None,自然无法匹配到数据库中的Booking实例
解决方案(二选一)
方案一:修改视图适配URL参数名(推荐)
修改EditBookingView中两处读取参数的代码,将booking_reference替换为slug:
class EditBookingView(UpdateView, NextUrlMixin): model = Booking form_class = BookingForm template_name = 'bookings/edit_booking.html' success_url = '/' default_next = '/' def form_valid(self, form): form.instance.user = self.request.user form.save() next_path = self.get_next_url() return redirect(next_path) def get_context_data(self, **kwargs): context = super(EditBookingView, self).get_context_data(**kwargs) context['slug'] = self.kwargs['slug'] # 修正参数名 return context def get_object(self): slug = self.kwargs.get('slug') # 修正参数名 return get_object_or_404(Booking, booking_reference=slug)
方案二:修改URL适配视图参数名
若不想改动视图代码,可修改urls.py中的路径参数名,并同步更新模板的URL反向解析:
- 修改
urls.py:
urlpatterns = [ # ... 其他路径同理修改 ... path('editbooking/<str:booking_reference>/', EditBookingView.as_view(), name='edit_booking'), ]
- 修改模板中的链接:
<div class="row text-center mt-3"> <a class="btn btn-primary justify-content-md-center mb-5" href='{% url "bookings:edit_booking" booking_reference=item.booking_reference %}' role="button" >Edit Booking</a> </div>
额外调试技巧
可以在get_object方法中添加打印语句,确认实际传入的参数:
def get_object(self): print("传入的kwargs:", self.kwargs) # 查看所有参数 slug = self.kwargs.get('slug') print("获取到的slug值:", slug) return get_object_or_404(Booking, booking_reference=slug)
运行服务器后查看控制台输出,即可明确参数是否正确传递。
内容的提问来源于stack exchange,提问作者nlewis99
相关产品推荐
相关产品推荐

