You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 06:50:27