allow_tags=True 不在 django admin 中渲染 <form> 标签

Posted

技术标签:

【中文标题】allow_tags=True 不在 django admin 中渲染 <form> 标签【英文标题】:allow_tags=True does not render <form> tag in django admin 【发布时间】:2013-04-30 22:18:09 【问题描述】:

我想在 django admin 的 list_display 中显示一个表单,但我遇到了这个问题:

当我定义这样的东西时:

class MyModelAdmin(admin.ModelAdmin):
    list_display = ('foo', 'pagar_pase')

    def pagar_pase(self, obj):
        return """<form action="." method="post">Action</form> """
    pagar_pase.description = 'Testing form output'
    pagar_pase.allow_tags = True

结果是没有标签的Action,有什么办法解决这个问题吗?

谢谢

【问题讨论】:

我怀疑问题出在你的想象中。 &lt;form&gt; 标签没有任何显示输出:它们唯一的结果是将内容视为可提交的表单。也许您的意思是有一个&lt;input type="submit"&gt; 标签,尽管如果没有实际提交的内容,这将无济于事。 【参考方案1】:

这是文档中出现的内容。一些提示:

我认为你应该在你的list_display 元组中包含pagar_pase,而且你最好使用format_html而不是三引号。

from django.utils.html import format_html

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    color_code = models.CharField(max_length=6)

    def colored_name(self):
        return format_html('<span style="color: #0;">1 2</span>',
                           self.color_code,
                           self.first_name,
                           self.last_name)

    colored_name.allow_tags = True

class PersonAdmin(admin.ModelAdmin):
    list_display = ('first_name', 'last_name', 'colored_name')

在这里,他们首先定义模型,然后创建一个ModelAdmin,然后在您缺少的list_display 中包含方法的名称。

你的代码应该是这样的:

class MyModelAdmin(admin.ModelAdmin):
    list_display = ('foo', 'my_custom_display', 'pagar_pase')

    def pagar_pase(self, obj):
        # I like more format_html here.
        return """<form action="." method="post">Action</form> """
    pagar_pase.description = 'Testing form output'
    pagar_pase.allow_tags = True

希望对你有帮助!

【讨论】:

也不工作,我已经编辑了我的问题,包括 list_display 上的 pagar_pase 并且不能像这样工作...... 真正的问题是django不会在列表显示上渲染表单标签,即使我使用allow_tags=True或format_html,它会渲染很多标签而不是表单标签 这是有道理的,因为它已经在表单中。我猜你应该尝试另一种方法:( 是的,我看到了,但我期待这里有一个不错的解决方案,我不知道如何面对这个问题,qucik 解决方案是使用 jquery 提交数据,但它是一个 paypal表格,我会检查:(...谢谢!!!!【参考方案2】:

您似乎正试图对列出的项目触发操作。也许通过编写自己的admin actions 来执行此操作会更好。

这是一个例子:

def pagar_pase(modeladmin, request, queryset):
    """ Does something with each objects selected """
    selected_objects = queryset.all()
    for i in selected_objects:
        # do something with i

pagar_pase.short_description = 'Testing form output'

class MyModelAdmin(admin.ModelAdmin):
    list_display = ('foo', 'my_custom_display')
    actions = [pagar_pase]

【讨论】:

自定义管理操作对我不起作用,因为我正在尝试在 list_display 上呈现贝宝表单【参考方案3】:

好的,所以这里的问题是 list_display 在一个 html 表单内,所以我试图在一个表单内显示一个表单,这是一个坏主意......下面解释了原因

Can you nest html forms?

希望对你有帮助。

【讨论】:

以上是关于allow_tags=True 不在 django admin 中渲染 <form> 标签的主要内容,如果未能解决你的问题,请参考以下文章

django model之Meta选项

Django 不在相关领域

Django 在/不在查询中

为啥 Django 不在 SQLite3 中重置序列?

为啥 Django 不在 Varnish 代理后面生成 CSRF 或会话 Cookie?

django cms 占位符不在结构视图中