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

3

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

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个回答

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'})}

覆盖默认小部件文档

我应该说明的是,这种方法适用于一次性使用。如果您想多次重复使用字段或JS,有更好的方法(为字段自定义小部件,如果JS与字段独占相关,则指定JS文件,扩展模板以在许多位置包含JS文件)。


这似乎是我期望的答案。我已经将ScribPartAdmin注册到我的模型中,但是类和JavaScript都不在这里。 - Pierre de LESPINAY
我没有看到代码很难帮助你。几点说明:脚本标签仅在编辑视图中出现,而不是列表视图中。检查HTML输出以确保没有脚本标签,也许脚本标签存在,但路径错误,因此JS文件未加载。 - Etienne

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"

如果只是针对JavaScript,Etienne的解决方案似乎更简单。然而,如果我这样做,如果我将模板放入正确的目录(/templates/admin/my_app/scribpart/change_form.html),我是否必须指定change_form_template - Pierre de LESPINAY
是的,然后您设置 change_form_template = "admin/my_app/scribpart/change_form.html"。 - Gabriel Ross

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>")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接