【问题标题】:Django - replace parts of urlfieldDjango - 替换部分 urlfield
【发布时间】:2013-12-29 11:47:27
【问题描述】:

我现在可以加载 youtube 的单个视频 URL。但现在的问题是加载 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;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)

【问题讨论】:

    标签: python django youtube


    【解决方案1】:

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

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

    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
    ...
    

    【讨论】:

    • 感谢您的回答。我试过了,但网址中仍然有一个&amp;。你能告诉我如何在正则表达式中做到这一点吗?请注意 index=1 可能会有所不同。再次感谢。
    • 网址里还有&amp;http://youtube.com/embed/1UiICgvrsFI&amp;list=PLvAOICvbvsbnc5dLG0YR9Mq_tFfzAhQSp
    • 它确实在控制台中工作,但我似乎无法在我的项目中工作......请你看一下编辑,我也添加了你的 sn-p。跨度>
    • 做到了!非常感谢!
    【解决方案2】:

    您可以使用HTMLParser.unescape 函数来取消转义网址:

    >>> 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'
    

    【讨论】:

    • 感谢您的回答。请注意,网址可能会根据用户上传的内容而有所不同。
    • @Robin 什么意思?
    • 对不起,我的错。但我也想删除&amp;&amp;index=...
    • @Robin 使用 urlstring.replace('&index=1', '') 或正则表达式子函数
    猜你喜欢
    • 2013-12-29
    • 2011-03-29
    • 2013-04-24
    • 2011-05-29
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    相关资源
    最近更新 更多