创建Room实例时触发无关视图DoesNotExist错误求助
问题排查:创建Room实例时触发room视图的DoesNotExist错误
执行创建Room模型实例的
room_form视图时,触发了原本正常的room视图中的DoesNotExist错误,错误提示:DoesNotExist at /rooms/create_room/ Room matching query does not exist错误指向
room视图中的room = Room.objects.get(slug=slug)行。
1. 核心问题:URL路由顺序错误
你的URL配置中,<slug:slug>/路由优先级高于create_room/。Django按顺序匹配URL,当访问/rooms/create_room/时,Django会把create_room当作slug参数传入room视图,执行Room.objects.get(slug='create_room'),因找不到对应实例抛出错误。
修复方案:调整URL顺序,将具体路径放在动态路由前面:
urlpatterns = [ path('', views.rooms, name='rooms'), path('create_room/', views.room_form, name="create_room"), path('<slug:slug>/', views.room, name='room'), ]
2. room_form视图的其他错误修复
2.1 移除多余的id参数
视图定义了id参数,但URL中未传递该参数,会导致路由匹配失败:
def room_form(request): # 删除id参数 # 后续逻辑
2.2 修正Room实例创建代码
原代码中Room.objects.create(room = room, ...)存在错误(模型无room字段),且可以简化表单处理逻辑:
def room_form(request): cf = RoomForm(request.POST or None) if request.method == 'POST': if cf.is_valid(): # 用表单实例创建对象,自动填充name字段 room = cf.save(commit=False) room.user = request.user room.save() return redirect(room.get_absolute_url()) context = { 'room_form': cf, } return render(request, 'rooms/create_room.html', context)
2.3 修复表单初始化逻辑
原代码仅在POST验证失败时初始化空表单,GET请求时会丢失room_form上下文,将表单初始化移到POST判断外即可解决。
3. Room模型slug生成优化
原save方法中self.created.day为整数,直接拼接会报错,且易出现slug重复问题,优化如下:
def save(self, *args, **kwargs): if not self.slug: # 先确保created字段有值(auto_now_add第一次保存自动生成) super(Room, self).save(*args, **kwargs) # 拼接日期生成唯一slug self.slug = slugify(f"{self.name}-{self.created.day}-{self.created.month}-{self.created.year}") super(Room, self).save(*args, **kwargs)
内容的提问来源于stack exchange,提问作者Ayat Rahman
相关产品推荐
相关产品推荐

