【问题标题】:allow_tags=True does not render <form> tag in django adminallow_tags=True 不在 django admin 中渲染 <form> 标签
【发布时间】: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; 标签,尽管如果没有实际提交的内容,这将无济于事。

标签: python django django-admin


【解决方案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?

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2013-05-05
    • 2018-06-05
    • 2011-07-25
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多