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

如何以编程方式获取Snippet的后台管理编辑URL

编程获取Wagtail Snippet对象的后台编辑URL

我在Wagtail里把产品作为Snippet管理,某款产品的后台编辑URL是:

http://localhost:8000/admin/snippets/blog/blogproduct/edit/18/

我想要直接通过代码获取这个URL,比如这样用:

product = BlogProduct.objects.get(id=18)
print(product.admin_edit_url)
# 期望输出: http://localhost:8000/admin/snippets/blog/blogproduct/edit/18/

虽然手动拼接也能实现:

print(f"http://localhost:8000/admin/snippets/blog/blogproduct/edit/{product.id}/")

但更希望用编程方式自动生成,避免硬编码带来的维护问题。


解决方案1:用Wagtail内置的URL反转函数

Wagtail的Snippet后台编辑视图已经注册了对应的URL名称,直接用reverse函数就能动态生成URL,不用硬编码路径:

步骤1:给模型添加属性方法

from django.urls import reverse
from wagtail.snippets.models import register_snippet

@register_snippet
class BlogProduct(models.Model):
    # 你的模型字段示例
    name = models.CharField(max_length=255)
    
    @property
    def admin_edit_url(self):
        # 反转编辑URL,参数依次是app标签、模型名、对象ID
        return reverse(
            'wagtailadmin_snippets:edit',
            args=(self._meta.app_label, self._meta.model_name, self.pk)
        )

步骤2:调用属性获取URL

product = BlogProduct.objects.get(id=18)
print(product.admin_edit_url)
# 输出: /admin/snippets/blog/blogproduct/edit/18/

如果需要带完整域名的URL(比如邮件通知里用),可以结合请求对象的build_absolute_uri方法:

# 在视图或模板中使用request对象
full_edit_url = request.build_absolute_uri(product.admin_edit_url)
print(full_edit_url)
# 输出: http://localhost:8000/admin/snippets/blog/blogproduct/edit/18/

解决方案2:动态拼接(轻量版)

如果不想依赖Wagtail的URL反转,也可以通过模型的元数据动态拼接路径,避免硬编码app标签和模型名:

from wagtail.snippets.models import register_snippet

@register_snippet
class BlogProduct(models.Model):
    name = models.CharField(max_length=255)
    
    @property
    def admin_edit_url(self):
        return f"/admin/snippets/{self._meta.app_label}/{self._meta.model_name}/edit/{self.pk}/"

这种方式本质还是拼接,但利用了模型自带的元数据,比完全手写路径灵活得多,后续修改模型的app标签或名称时不用改URL拼接逻辑。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 03:20:10