在Django Admin中实现唯一标识符URL重定向至cart修改页
实现Django Admin中唯一标识符到ID的URL重定向
嗨,这个需求其实很好解决,我给你两种靠谱的实现方案,你可以根据自己的项目情况来选:
方案一:自定义AdminSite(推荐,整合性更强)
这种方式完全在Django Admin的体系内处理,权限验证会自动继承Admin的规则,非常稳妥。
在你的
cartapp下的admin.py里自定义AdminSite类
我们需要重写get_urls方法,添加一个捕获唯一标识符的路由,然后处理重定向逻辑:# cart/admin.py from django.contrib import admin from django.shortcuts import redirect, get_object_or_404 from django.urls import path from .models import Cart class CustomCartAdminSite(admin.AdminSite): def get_urls(self): # 先获取默认的Admin路由列表 default_urls = super().get_urls() # 添加自定义的重定向路由,必须放在默认路由前面才能优先匹配 custom_redirect_urls = [ path( 'cart/<str:uniq_identifier>/change/', self.handle_uniq_redirect, name='cart_uniq_redirect' ) ] # 合并路由,自定义路由在前 return custom_redirect_urls + default_urls def handle_uniq_redirect(self, request, uniq_identifier): # 根据唯一标识符获取对应的Cart对象(确保uniq_identifier字段是唯一的) cart = get_object_or_404(Cart, uniq_identifier=uniq_identifier) # 重定向到用ID的修改页面,这里的路由名称格式是`admin:<app>_<model>_change` return redirect( 'admin:cart_cart_change', object_id=cart.id ) # 注册Cart模型到自定义的AdminSite custom_admin_site = CustomCartAdminSite(name='custom_cart_admin') custom_admin_site.register(Cart)替换项目urls.py中的默认Admin路由
把原来的admin.site.urls换成我们自定义的custom_admin_site.urls:# 项目根目录下的urls.py from django.urls import path from cart.admin import custom_admin_site urlpatterns = [ path('admin/', custom_admin_site.urls), # 其他项目路由... ]
方案二:直接添加全局路由(更简单,适合快速实现)
如果不想自定义AdminSite,也可以直接在项目的urls.py里添加路由,记得加上Admin权限验证:
# 项目根目录下的urls.py from django.contrib import admin from django.contrib.admin.views.decorators import staff_member_required from django.shortcuts import redirect, get_object_or_404 from django.urls import path from cart.models import Cart # 用staff_member_required确保只有管理员能访问这个重定向路由 @staff_member_required def cart_uniq_to_id_redirect(request, uniq_identifier): cart = get_object_or_404(Cart, uniq_identifier=uniq_identifier) # 直接构造目标URL重定向 return redirect(f'/admin/cart/cart/{cart.id}/change/') urlpatterns = [ # 注意:这个自定义路由必须放在admin/路由的前面! path('admin/cart/<str:uniq_identifier>/change/', cart_uniq_to_id_redirect), path('admin/', admin.site.urls), # 其他项目路由... ]
关键注意点
- 路由顺序:自定义的重定向路由一定要放在默认的
admin/路由前面,这样Django才会优先匹配你的自定义规则,而不是走默认的Admin路由。 - 字段唯一性:确保你的
Cart模型中uniq_identifier字段设置了unique=True,这样get_object_or_404才能准确找到对应的唯一对象。 - 权限验证:方案二一定要加
staff_member_required装饰器,避免未授权用户通过这个路由访问Admin内容。
内容的提问来源于stack exchange,提问作者Gene Sescon
相关产品推荐
相关产品推荐

