【问题标题】:Newlines are getting replaced with HTML linebreak in the Django admin在 Django 管理员中,换行符被 HTML 换行符取代
【发布时间】:2014-07-08 14:48:16
【问题描述】:

我正在尝试将一些 HTML 模板包含到我的一个模型的 django change_form.html 默认模板中。 我的主要目标是在 Django 后端创建一些图表。

我遇到的问题是换行符不断被<br /> 取代。 这特别麻烦,因为它破坏了我真正感兴趣的页面中包含的 JavaScript 代码。

目前我的方法是在我的 ModelAdmin 类上使用 readonly_fields,并在我的模型中使用一个函数,该函数返回我的模板的 render_to_string

我的模型

class Link(models.Model):
        user = models.ForeignKey(
            'auth.User',
            verbose_name=_('Author'),
            related_name="tinylinks",
        )

        link = models.CharField(
            max_length=2500,
            verbose_name=_('Link'),
        )

        clicks = models.PositiveIntegerField(
            default=0,
            verbose_name=_('Amount of views'),
        )

        def click_statistics(self):
            response = render_to_string(
                'admin/links/link/click_statistics.html', {})

ModelAdmin 类

class LinkAdmin(admin.ModelAdmin):
    list_display = ('link', 'user', 'clicks')
    search_fields = ['link', 'user']

    readonly_fields = ('click_statistics',)

    fieldsets = [
            ('Link', {'fields': ['user', 'link', 'clicks',]}),
            ('Statistics', {'fields': ['click_statistics',]}),
    ]

这将是 click_statistics.html

<table border="0" cellspacing="">
    <tr>
        <td valign="top">
            <div id='stat_line' class='stats_line line' style='display:block'>
                <script id="graphstat_line" type="text/javascript">
                    function graphstat_line() {
                        var data = google.visualization.arrayToDataTable([]);

                        var options = {
                            'legend': "none",
                            'pointSize': 3,
                            'theme': "maximized",
                            'curveType': "function",
                            'width': 430,
                            'height': 220,
                            'hAxis': {minTextSpacing: 80, maxTextLines: 1, maxAlternation: 1},
                            'vAxis': {minValue: -0.5, format: '#'},
                            'colors': ['#2a85b3']
                        }

                        new google.visualization.LineChart( document.getElementById('visualization_stat_line') ).draw( data, options );}
                        google.setOnLoadCallback( graphstat_line );
                </script>
                <div id="visualization_stat_line"></div>
            </div>
        </td>
    </tr>
</table>

我的问题如下:

  • 当 render_to_string 的输出包含在管理 change_form.html 模板中时,为什么换行符会被 &lt;br /&gt; 替换?
  • 有什么办法可以阻止这种行为?

【问题讨论】:

  • "Django" 不这样做。你的代码正在以某种方式做到这一点。但由于您尚未发布任何内容,我们无法帮助您修复它。
  • 感谢您的回复丹尼尔,我会用代码更新我的问题。
  • 我也遇到过这个问题。绝对似乎是Django的错。当我在我的管理方法中打印该值时,它看起来不错,但返回给浏览器的结果包含“
    ”。非常令人沮丧。我的解决方法是自己替换所有换行符,并确保我的内联 JS 代码格式正确以评估为单行。另外,不要介意罗斯曼的粗鲁。他有点傲慢。
  • 谢谢Cerin,很高兴知道这是别人经历过的事情。最后我走了一条完全不同的路,不再尝试在管理员中添加该模板。

标签: django django-templates django-admin


【解决方案1】:

你在使用 django-suit 吗?如果是这样,那么问题出在模板suit/templates/admin/includes/fieldset.html

    {# If multi-fields and wrap controls too #}
     {% if not singlefield %}
        <div class="multi-field-controls">
      {% endif %}

    {% if field.is_readonly %}
        <span class="readonly">{{ field|field_contents_foreign_linked|linebreaksbr }}</span>
    {% else %}
        {{ field.field }}
    {% endif %}

    {# For single field errors#}
    {% if singlefield and line.errors %}
        <span class="help-inline">{{ line.errors }}</span>
    {% endif %}

将该模板复制到 INSTALLED_APPS 上更高级别的应用或 TEMPLATE_DIRS 中列出的目录(即TEMPLATE_DIR/admin/includes/fieldset.html)并从上面的行中删除|linebreaksbr

几个月前我遇到了这个问题,完全偶然地偶然发现了解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-12
    • 2015-09-08
    • 1970-01-01
    • 2011-09-13
    • 2013-02-27
    • 2014-09-10
    • 2013-10-21
    • 1970-01-01
    相关资源
    最近更新 更多