Django UrlField自定义超链接

17 篇文章 0 订阅
10 篇文章 2 订阅

需求背景:

前提:会使用Django自带的admin后台
Django 自带的 admin,在注册模型时,添加 list_display_links,可指定某些字段可点击跳转页面

# 数据库模型
class BaseTable(models.Model):
    project = models.CharField(max_length=50, verbose_name='项目名称')
# 注册admin
@admin.register(BaseTable)
class BaseTableAdmin(admin.ModelAdmin):
	list_display = ("project", )	# 列表中展示project字段
	list_display_links = ('project',)	# 点击列表中的project跳转到修改页面

跳转页面默认为 /admin/项目名/xxx/index/change/,如果我们不想跳转到修改页面,想设置跳转到其他链接呢?比如跳转到子项目页面?

方案一

修改 project 字段类型为 URLField

# 数据库模型
class BaseTable(models.Model):
    project = models.UrlField(verbose_name='项目名称')
class URLFieldWidgetWithLink(AdminURLFieldWidget):
    def render(self, name, value, attrs=None):
        html = AdminURLFieldWidget.render(self, name, value, attrs=attrs)

        if value is not None:
            final_attrs = dict(href=value, target='_blank')
            html += " <a %s>(open)</a>" % attributes_to_str(final_attrs)
        
        from django.utils.safestring import mark_safe
        return mark_safe(html)
        
@admin.register(BaseTable)
class BaseTableAdmin(admin.ModelAdmin):
	list_display = ("project", )	# 列表中展示project字段
	list_display_links = ('project',)	# 点击列表中的project跳转到修改页面
	formfield_overrides = {
        django_fields.URLField: {'widget': URLFieldWidgetWithLink},
    }

此方法仅参考官网说明,作者并未实现成功,官网链接

方案二

admin自定义超链接列

  1. 数据模型不变,仍使用 CharField
  2. admin 注册
@admin.register(BaseTable)
class BaseTableAdmin(admin.ModelAdmin):
	list_display = ("url2", )	# 列表中展示project字段
	
	@admin.display
    def url2(self, obj):	# 注册自定义字段url2
        if obj.report_url:
        	# 以format_html 以模板返回,django会将字符串识别成html模板
            return format_html(f'<a href="{obj.project}">{obj.project}</a>')	
        else:
            return "-"
    url2.short_description = '项目名称'	# 自定义列的title
    url2.admin_order_field = "project"	# 排序字段

做到这一步,已经可以在admin列表中调整到自定义的超链接地址了,当然可能会报404, 500 等异常,因为还没有配 Django 都路由
在 urls.py 配置好路由跳转,并返回对应的视图即刻完成。
3. 路由配置 urls.py

urlpatterns = [
   url('^project/(?P<url>.+)/$', GetFile.report, name="report"),
  1. 视图配置
def report(request, url):
    """返回视图"""
    return render(request, "{}".format(url))
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值