Django 如何在模板中很好地呈现URL字段

Django 如何在模板中很好地呈现URL字段,django,django-templates,Django,Django Templates,问题 我有一个像这样的联盟的模型 class League(models.Model): league_name = models.CharField(max_length=60) league_url = models.URLField(null=True, blank=True, default='') 其中,league\u url可以是指向外部联盟页面(即不是我的网站)的链接 现在,假设用户创建了一个联盟,并将联盟url设置为“pelicanpark.com/leagu

问题

我有一个像这样的联盟的模型

class League(models.Model):
    league_name = models.CharField(max_length=60)
    league_url = models.URLField(null=True, blank=True, default='')
其中,
league\u url
可以是指向外部联盟页面(即不是我的网站)的链接

现在,假设用户创建了一个联盟,并将联盟url设置为“pelicanpark.com/leagues/27”。当我在模板中呈现它时,
{{{league.league\u url}
它显示
http://www.pelicanpark.com/leagues/27/
这占用了很多不动产

所以,我需要减肥。我的想法是呈现如下内容

<a href="http://www.pelicanpark.com/leagues/27/">pelicanpark.com/...</a>


但这有一些明显的复杂性。有人对此有好的解决方案吗?

您可以使用
MethodSerializer

class League(models.Model):
    league_name = models.CharField(max_length=60)
    nice_league_url = serializers.SerializerMethodField()


    def get_league_url(self,obj):
        final_url = "<a href="+obj.league_url+">pelicanpark.com/...</a>"
        return final_url
班级联盟(models.Model):
league_name=models.CharField(最大长度=60)
nice\u league\u url=serializers.SerializerMethodField()
def获取联盟url(自我,obj):
final_url=“”
返回最终url

对于这类事情,可能有一些奇特的用法,但这是我无法理解的。幸运的是,它看起来像是为python设计的。要在示例中实现它,请执行以下操作:

from urlparse import urlparse

class League(models.Model):
    league_name = models.CharField(max_length=60)
    league_url = models.URLField(null=True, blank=True, default='')

    def url_text(self):
        parsed_url = urlparse(self.league_url)
        return parsed_url.hostname.replace("www.", "") + "/..."
然后在模板中:

<a href="{{ league.league_url }}">{{ league.url_text }}</a>


我会避免在后端呈现html。我总是被告知这样做会有安全风险。

以上答案很贴切。我只是遇到了同样的问题,并发现了一些变化。对于Python3及更高版本,请使用:

from urllib.parse import urlparse

相反。

由。。。你是说你想要
pelicanpark.com/…
还是
pelicanpark.com/leagues/27/
?问得好。我的意思是,
pelicanpark.com/…
你能通过在模板中执行以下操作来扩展更多关于复杂性的内容吗<代码>其中league是传递给模板的用户的league实例。这似乎是最简单的了?@Ben pelicanpark.com只是一个示例url。实际上,联盟url可以是任何东西。例如,如果url是“myleaguesite.com/leagues/123”,我想显示
。换句话说,“domain.com/…”应该根据实际的联盟url动态呈现。