【问题标题】:Overriding get_absolute_url from a model for the sitemap从站点地图的模型中覆盖 get_absolute_url
【发布时间】:2013-04-18 01:55:25
【问题描述】:

嘿,我有一个可以通过 2 个不同的 url 访问的模型(取决于域)。我在视图和模板中像这样使用它们没有问题。

在构建站点地图时,get_absolute_url 不应该返回相同的结果,所以我想:我可以子类化模型并覆盖 get_absolute_url 方法:

class FanpitConcert(BandtasticConcert):
    def get_absolute_url(self):
        return ('event_checkout',(),{'artist_slug':self.slug_name,
                                     'year': self.get_date().year,
                                     'month': self.get_date().month,
                                     'day': self.get_date().day,
                                    })
    class Meta:
        abstract = True

然后将这个子类模型用于站点地图类

class ConcertsSiteMap(Sitemap):
    def items(self):
        return FanpitConcert.objects.all().filter(app='Fanpit')

但是当我访问 /sitemap.xml django 时仍然从原始模型调用 get_absolute_url

django 这里有什么黑魔法吗?还是我遗漏了一些明显的东西?

更新

我尝试删除 abstract = True 部分并使用 元类: db_table = 'same_table_as_base_model'

但现在 django 抱怨找不到列。

【问题讨论】:

    标签: django models subclassing sitemap.xml


    【解决方案1】:

    在这种情况下,最好使用代理模型,而不是抽象。

    所以子类模型会有

    class Meta:
        proxy = True
    

    更多关于代理模型的信息here

    【讨论】:

    • 我无法将基本模型抽象化,因为它在许多关系中使用,并且我得到“要么尚未安装要么是抽象的”。这些关系的错误。并且获取 Meta 的技巧不起作用 :( 我得到 'BandtasticConcert' 没有属性 'Meta' 即使我在模型上定义了它。
    • @GuillermoSiliceoTrueba 尝试将子类模型制作成代理。在他们的Meta 类中设置proxy=True 并完全删除抽象。请参阅here 了解更多信息。
    • 这就是答案,谢谢!你能把它写成答案形式,这样我就可以这样标记了吗?
    猜你喜欢
    • 2013-04-20
    • 1970-01-01
    • 2023-02-12
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 2011-01-20
    • 2014-05-21
    • 1970-01-01
    相关资源
    最近更新 更多