Django striptags,逗号分隔的关键字

Django striptags, comma separated keywords

想实现这个,例子:

models.py

class Theory(models.Model):
    sort = models.PositiveIntegerField(default=1, blank=False, null=False)
    title = models.CharField(max_length=500)
    title_url = models.SlugField(max_length=500)
    graphics = models.ImageField(upload_to='theory', blank=True)
    description = RedactorField(blank=True)

    def __unicode__(self, ):
        return self.title

里面

description = RedactorField(blank=True)

将始终是具有 3、10、8 或其他数量的 <li> 标签的 UL。也许以后会添加几段,但现在每个新对象(理论)只有 UL

假设我的模板变量包含 Django Admin 中所见即所得编辑器的描述

<ul>
    <li>Theory of Relativity</li>
    <li>Interstellar</li>
    <li>5D</li>
    <li>Black Hole</li>
    <li>Tesseract</li>
</ul>

index.html

{% for text in space %}
    {{ text.description | safe }}
{% endfor %}

这将输出上面的 HTML。

我的目标是:

Theory of Relativity, Interstellar, 5D, Black Hole, Tesseract

我知道我能做到:

{% for text in space %}
    {{ text.description | safe | striptags }}
{% endfor %}

输出将是:

Theory of RelativityInterstellar5DBlack HoleTesseract

如何使用 Django 和 Python 实现 Striptags + 逗号分隔但精确的短语。

我知道我可以在编辑器的 Admin 中添加逗号,但我做不到。我需要 HTML 我在页面其他地方用作 UL 的输出,但我也需要那个输出。

我的建议是不要将其作为 HTML 存储在数据库中,而是将单个值存储在数据库中,然后您可以在需要的任何地方将其输出为 HTML 或逗号分隔列表。

您可以在服务器端非常轻松地进行这种格式化并将其输出为模型的属性。示例:

# models.py

from django.template.defaultfilters import join as join_filter
from django.template.loader import render_to_string

class Theory(models.Model):

    title = models.CharField(max_length=300)

    @propery
    def as_html(self):
        return render_to_string('theories.html', {'theories': self.objects.all()})

    @property
    def as_comma_separated_list(self):
        return join_filter(self.objects.values_list('title', flat=True), ', ')

# theories.html

<ul>
    {% for theory in theories %}
    <li>{{ theory }}</li>
    {% endfor %}
</ul>

现在您的模板是 "dumb",您不必在 BeautifulSoup 之后对 HTML 进行任何昂贵的解析,等等

如果您确实必须走 BeautifulSoup 路线,那并不难:

from bs4 import BeautifulSoup

soup = BeautifulSoup(content, 'html.parser')
theories = ', '.join([li.text for li in soup.findAll('li')])