Django的快捷方式获取数据和mark_safe特定列

时间:2015-06-04 13:14:16

标签: django

我只是想知道是否有快捷方式来执行此代码? 代码获取视频数据,然后mark_safe嵌入代码。

videos = Video.objects.all()

    mark_safe_videos = []
    for video in videos:
        video.embed_code = mark_safe(video.embed_code)
        mark_safe_videos.append(video)

我正在使用Django 1.8

3 个答案:

答案 0 :(得分:2)

您始终只需向模型添加属性,并避免在视图中添加任何其他代码:

from django.template.defaultfilters import mark_safe


class Video(models.Model):
    . . .

    @property
    def safe_embed(self):
        return mark_safe(self.embed_code)

我倾向于赞成“胖模型,瘦小的控制器(Django中的视图)”方法。

答案 1 :(得分:1)

除了Brandon的答案,我更喜欢这个答案,因为它在整个应用程序中公开了这个功能,你也可以在你的视图中通过列表理解来实现它:

一个字段的values_list

videos = [mark_safe(v) for v in Videos.objects.values_list('embed_code', flat=True)]

values_list会将请求的字段作为列表返回。由于只有embed_code是相关的,因此使用flat=True会返回一个一维列表,我们可以在列表解析中将mark_safe的值用于videos变量。

更新: 多个字段的values_list

可以使用相同的方法查询两个或多个字段。

# views.py
videos = [
    (v[0], mark_safe(v[1])) 
    for v in Video.objects.values_list('title', 'embed_code')
]

在模板中:

{% for video in videos %}
Title: {{ video.0 }}<br/>
Embed code: {{ video.1 }}
{% endfor %}

答案 2 :(得分:0)

我会做这样的事情:

def safe_embed_code(video):
    video.embed_code = mark_safe(video.embed_code)

mark_safe_videos = [safe_embed_code(v) for v in Video.objects.all().iterator()]