需求背景:
前提:会使用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自定义超链接列
- 数据模型不变,仍使用 CharField
- 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"),
- 视图配置
def report(request, url):
"""返回视图"""
return render(request, "{}".format(url))