1. 程式人生 > 程式設計 >django admin 新增自定義連結方式

django admin 新增自定義連結方式

背景

最近做專案開發出現一個需求,就是前端會發來使用者對某一項內容的報錯,報錯資訊中包含出錯內容的id,為了方便管理,需要實現點選這個id直接轉達相應內容的詳情頁面。

效果展示

解決

首先在django admin的列表中檢視資料id所代表的連結

django admin 新增自定義連結方式

使用瀏覽器的檢查元素功能檢視點選該id所跳轉的連結

django admin 新增自定義連結方式

現在我們知道點選admin頁面跳轉連結的格式了。

自定義widget

假如我們的內容id使用CharField欄位儲存,那麼可以這樣自定義一個widget

HTML

{% load myfileter %}
<a href="{{ widget.value|generate_link }}" rel="external nofollow" >{{ widget.value }}</a>

{%load myfilter%}是引入自定義模板標籤的語句,該標籤在下面定義。

python

class MyWidget(TextInput):
  template_name = "myWidget.html"
  def render(self,name,value,attrs=None,renderer=None):
    context = self.get_context(name,attrs)
    template = loader.get_template(self.template_name).render(context)
    return mark_safe(template)

自定義模板過濾器

在views.py所在的目錄下新建一個資料夾templatetags,注意必須為這個名字。在資料夾中新建一個myfileter.py檔案和_init_.py檔案。

myfileter.py

# 生成自定義連結
@register.filter
def generate_link(value):
  id = str(value)
  #就是將第二張圖片中的id替換為當前的id就行
  return "/admin/learningsource/learningsource/" + id + "/change/"

自定義模型表單

假如我們的模型定義如下

class FeedbackModel(models.Model):
  error_content_id=models.UUIDField("錯誤編號",primary_key=True,default=uuid.uuid4())
  ........

在models.py中定義一個ModelForm

class FeedbackModelForm(ModelForm):
  error_content_id = forms.CharField(label="錯誤編號",widget=MyWidget)

  class Meta:
    model = SourceLinkErrorReport
    fields = ['error_content_id',.....]

假如該模型在admin.py的模型管理器為

class FeedbackModelAdmin(admin.ModelAdmin):
..........

將上述定義的模型表單新增到模型管理器中

class FeedbackModelAdmin(admin.ModelAdmin):
form=FeedbackModelForm
..........

總結

使用這種方法可以不用建立一個空的模型然後重寫它的changelist_view函式實現自定義連結,可以給admin介面的文字,圖片等新增連結(通過自定義widget就可實現),並且連結樣式可以自己定義,使用更方便。

在安全性上,本文的做法實際上相當於自己手動給django admin內建檢視函式傳送請求,和原來django自己自動生成的頁面連結沒有任何區別,對自定義連結的響應實際上也要經過**django ** admin的認證,安全性是沒問題的。

以上這篇django admin 新增自定義連結方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。