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

修改Slug规则后Django URLs未更新的问题求助

问题解决步骤

1. 批量更新现有Entry对象的Slug

自定义save()方法仅在对象保存时触发新Slug生成逻辑,已存在的旧Entry对象未执行过新规则。需手动触发所有旧对象的保存操作来更新Slug:

  1. 打开Django命令行:
python manage.py shell
  1. 执行批量更新代码:
from your_app_name.models import Entry
# 遍历所有Entry对象并保存,触发新的Slug生成
for entry in Entry.objects.all():
    entry.save()

注意:若新规则生成的Slug存在重复(违反unique=True约束),会抛出异常。此时需调整Slug生成逻辑,比如在末尾添加对象ID确保唯一:

self.slug = slugify(f"{self.1}-{self.2}-{self.3}-{self.5}-{self.id}")

2. 修正视图中的跳转逻辑

表单提交成功后的redirect使用的是查询出来的entry.slug,但如果Entry对象的Slug已被更新,内存中的entry实例仍保留旧Slug值。需在保存关联Post后,刷新Entry实例获取最新Slug:

修改视图代码:

def post_page(request, slug):
    form = PostForm()
    entry = Entry.objects.get(slug=slug)
    if request.method == "POST":
        form = PostForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.entry = entry
            post.save()
            
            # 刷新Entry实例,获取最新Slug
            entry.refresh_from_db()
            return redirect('post_page', slug=entry.slug)
        else:
            msg_error = 'Please correct errors and resubmit'
            return render(request, 'post_page.html', {'entry': entry, 'form':form, 'msg_error':msg_error})

    return render(request, 'post_page.html', {'entry': entry, 'form':form})

3. 修正get_absolute_url的视图名称

模型中get_absolute_url使用的reverse("page", ...)与URL配置里的视图名称post_page不匹配,会导致跳转错误。修正模型代码:

def get_absolute_url(self):
    return reverse("post_page", kwargs={"slug": self.slug})

4. 清除浏览器缓存

页面刷新404可能是浏览器缓存了旧URL,按Ctrl+Shift+R(Windows/Linux)或Cmd+Shift+R(Mac)强制刷新页面清除缓存。

5. 清除Django缓存(若启用)

如果项目使用了Django缓存框架,旧Slug或页面可能被缓存。执行以下命令清除缓存:

python manage.py clearcache

若未安装clearcache,先执行pip install django-clearcache,或通过缓存API手动清除。


内容的提问来源于stack exchange,提问作者PolarBear

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 11:16:01