Django - 管理员自定义字段显示与行为

3 投票
3 回答
4837 浏览
提问于 2025-04-16 23:23

我们来想象一下这个模型:

class ScribPart(models.Model):
  name = models.CharField(max_length=50, unique=True)
  text = models.TextField()

我想给字段 text 添加一个特定的类,并且调用一个特定的js文件。这样,管理员页面就会像这样:

...
<script type="text/javascript" src="/static/js/mymarkup.js"></script>
...
<textarea id="id_text" name="text" class="mymarkup"></textarea>
...

我该如何通过一个小工具和/或自定义的管理员表单来实现这个呢?

3 个回答

0

你可以用这个代码把你的表单发送为json格式,然后进行获取(检查)。

results = ScribPart.all()
    for r in results :

        if r.test == id_text:
            self.response.out.write("<script type='text/javascript' src='/static/js/"+r.name+"mymarkup.js'></script>")
2

你需要创建一个模板,把它放在 templates/admin/change_form_scribpart.html 这个位置,内容如下:

{% extends "admin/change_form.html" %}
{% load i18n %}

{% block content %}
    <script type="text/javascript" src="/static/js/mymarkup.js"></script>
    {{ block.super }}
{% endblock %}

另外,别忘了在你的 ScribPart ModelAdmin 中激活这个新的管理员模板:

class ScribPartAdmin(admin.ModelAdmin):   
    ordering = ...
    fieldsets = ...
    change_form_template = "admin/change_form_scribpart.html"
5

在管理页面插入一个 <script> 的最简单方法就是:

class ScribPartAdmin(model.ModelAdmin):
    ...
    your normal stuff...
    ...

    class Media:
        js = ('/path/to/your/file.js',)

关于ModelAdmin媒体定义的文档

现在,要给 textarea 添加 class 属性,我觉得最简单的方法是这样做:

from django import forms

class ScribPartAdmin(model.ModelAdmin):
    ...
    your normal stuff...
    ...

    class Meta:
        widgets = {'text': forms.Textarea(attrs={'class': 'mymarkup'})}

关于覆盖默认字段类型或小部件的文档

我还要补充一下,这种方法适合一次性使用。如果你想多次重用你的字段或JavaScript,还是有更好的方法(比如为字段创建自定义小部件,如果JavaScript只和这个字段相关的话,可以指定JS文件,或者扩展模板在多个地方包含一个JS文件)。

撰写回答