我只是想知道是否有快捷方式来执行此代码? 代码获取视频数据,然后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
答案 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()]