Django - 替换urlfield的部分

时间:2013-12-11 13:19:08

标签: python django youtube

我现在可以加载youtube的单个视频网址。但现在的问题是加载youtube的播放列表视频。所以我的问题是,如何替换两个相同的模式,但两者都有不同的url替换?

例如:

实际网址:

<iframe width="400" height="327" src="http://www.youtube.com/embed/1UiICgvrsFI&amp;list=PLvAOICvbvsbnc5dLG0YR9Mq_tFfzAhQSp&amp;index=1" allowfullscreen="true"></iframe>

将图案替换为如下:

<iframe width="560" height="315" src="//www.youtube.com/embed/1UiICgvrsFI?list=PLvAOICvbvsbnc5dLG0YR9Mq_tFfzAhQSp" allowfullscreen></iframe>

此处&amp;的第一次?更改以及第二次&amp;及其后续内容即&amp;index=1被删除。

这是models.py:

class Video(models.Model):
    title = models.CharField(max_length=100)
    video_url = models.URLField(max_length=100)

    def save(self, *args, **kwargs):
        new_url = (self.video_url.replace("watch?v=","v/"))
        super(Video, self).save(*args, **kwargs)
        if new_url:
            self.video_url = new_url

修改

def save(self, *args, **kwargs):
        new_url = re.sub('watch\?v=','embed/',self.video_url)
        new_url = re.sub(r'^(http:\/\/)([\w\W]+)\&amp;list=([\w\W]+)(\&amp;index=[\d]+)$', r'//\2?list=\3', new_url)
        if new_url:
            self.video_url = new_url
            super(Video, self).save(*args, **kwargs)

2 个答案:

答案 0 :(得分:3)

首先,似乎您的网址已经过编码。请检查模板中是否有|urlencode过滤器(https://docs.djangoproject.com/en/dev/ref/templates/builtins/#urlencode)。

要将视频网址更改为播放列表网址,您必须使用正则表达式。您可以创建一种方法,将视频网址转换为播放列表网址:

import re
...
def playlist_url(self):
    """
    Generates a playlist URL
    """
    new_url = re.sub(r'^(http:\/\/)([\w\W]+)&list=([\w\W]+)(\&index=[\d]+)$', r'//\2?list=\3', self.video_url)
    return new_url
...

答案 1 :(得分:1)

您可以使用HTMLParser.unescape函数取消unescaping url:

>>> import HTMLParser
>>> h = HTMLParser.HTMLParser()
h.unescape("http://www.youtube.com/embed/1UiICgvrsFI&amp;list=PLvAOICvbvsbnc5dLG0YR9Mq_tFfzAhQSp&amp;index=1")
'http://www.youtube.com/embed/1UiICgvrsFI&list=PLvAOICvbvsbnc5dLG0YR9Mq_tFfzAhQSp&index=1'