【问题标题】:Django - Admin custom field display & behaviorDjango - 管理自定义字段显示和行为
【发布时间】:2011-10-25 01:25:43
【问题描述】:

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

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>
...

如何使用小部件和/或自定义管理表单来做到这一点?

【问题讨论】:

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


    【解决方案1】:

    要在管理页面中插入&lt;script&gt;,最简单的做法是:

    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 文件) .

    【讨论】:

    • 这似乎是我所期待的答案。我已经用我的模型注册了 ScribPartAdmin,但是这个类不在这里,也没有 javascript。
    • 我很难在没有看到代码的情况下帮助您。一些注意事项:脚本标签只会出现在编辑视图上,而不是列表视图上。检查 HTML 输出以确保没有脚本标签,可能脚本标签在那里但路径错误,因此没有加载 JS 文件。
    【解决方案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的解决方案似乎更简单。然而这很有趣,如果我这样做,我是否必须指定change_form_template,如果我将模板放入好的目录(/templates/admin/my_app/scribpart/change_form.html)?
    • 是的,然后你设置 change_form_template = "admin/my_app/scribpart/change_form.html"
    【解决方案3】:

    您可以使用 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>")
    

    【讨论】:

      猜你喜欢
      • 2018-11-20
      • 2015-02-16
      • 2016-02-13
      • 2020-06-21
      • 2013-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多