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

时间:2011-08-11 14:34:05

标签: python html django django-admin django-widget

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

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 :(得分:5)

要在管理页面中插入<script>,最简单的方法是:

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

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

ModelAdmin media definitions documentation

现在要将class属性添加到textarea我认为最简单的方法就是这样:

from django import forms

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

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

Overriding the default widgets documentation

我应该补充一点,这种方法适合一次性使用。如果你想多次重用你的字段或JS,那么有更好的方法(字段的自定义小部件,如果JS与字段完全相关,则指定JS文件,扩展模板以在许多地方包含JS文件)

答案 1 :(得分:1)

您必须使用以下内容创建模板,将其放在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"

答案 2 :(得分:0)

您可以使用json pack发送表单并使用此代码获取(选中)

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