如何以编程方式获取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
相关产品推荐
相关产品推荐

