python - Django SEO 应用程序,集成外部数据,如 'Best {{ product }} of the year'

标签 python django

我正在尝试将外部数据集成到我的元标记中。我想要实现的目标 - 通过在标题字段(在管理中)输入“{{product.name}}的详细信息”,我希望在浏览器中自动获得“强子对撞机的详细信息”。我的模板中有这个

{% load seo %}
{% get_metadata for product as metadata %}
{{ metadata.title }}

并且我将 Product 对象传递给模板,但我得到的结果是未更改的“{{ Product.name }} 的详细信息”,因此 {{ value }} 不会被填充/解析?我已阅读文档 http://django-seo.readthedocs.org/en/latest/reference/administrators.html ,看起来很简单

If you would like to reference the relevant model instance, you type the name of the model surrounded by two braces. For example Buy {{ product }} today!. You can go further and reference different fields from the relevant instance, for example By {{ product.name }} today!.

虽然这对我不起作用。请帮忙。可能我做错了什么。

最佳答案

好吧,经过几天的抑郁:)我解决了它,至少对于我的项目来说,目前仅对于模型来说,但是对于 ModelInstance 和 View 来说,几乎我稍后会解决它,在我的情况下也有同样的问题。我对 Django 很陌生,所以可能存在更好的解决方案,我找到了这个。

我使用 Django 1.6.4、Python 2.7、多语言项目(Django Transmeta 进行模型翻译)

问题: 1.模型、模型实例和 View 中的变量替换不起作用。因此,如果我们将一个对象传递给 DjangoSEO,它不会替代例如{{ 产品 }}、{{ 产品.名称 }} 变量。根据文档应该如此。 Model 的问题位于 backends.py ModelBackend 类中。函数 _resolve_value 不会将对象传递给函数 _resolve,该函数应该用对象属性填充元标记。以下是对我有用的稍作更改的功能。

def _resolve_value(self, name):
    value = super(ModelMetadataBase, self)._resolve_value(name)
    try:
        return _resolve(value, self._content_object) 
    except AttributeError:
        return value

def _resolve(value, model_instance=None, context=None):
    """ Resolves any template references in the given value. """

    if isinstance(value, basestring) and "{" in value:
        if context is None:
            context = Context()
        if model_instance is not None:
            context[model_instance.__class__.__name__.lower()] = model_instance
    t = Template(value)
    value = t.render(context)
return value

此外,在文件 base.py 中,函数 get_linked_metadata 我们必须将对象附加到元数据实例,如下所示:

if ModelMetadata is not None:
    try:
        model_md = ModelMetadata.objects.get(_content_type=content_type, _language=language)
    except ModelMetadata.DoesNotExist:
        model_md = ModelMetadata(_content_type=content_type, _language=language)

    model_md._content_object = obj
    instances.append(model_md)

问题 2 - DjangoSEO 对任何语言都使用一个元数据实例,即使选项 use_i18n = True 也是如此。因此,请如上所述添加 _language=language。

Django SEO 应用程序非常好,它拥有 SEO 所需的一切(如果它有效:),因此没有理由重新发明轮子。

关于python - Django SEO 应用程序,集成外部数据,如 'Best {{ product }} of the year',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23630776/

相关文章:

python - Pyparsing Forward() 语法递归

python - 圣人数学重复过程

Django 查询空的related_set

python - django-paypal recurring_payment_id 为空

django - 我该如何注释?

python - Lock和RLock有什么区别

python - 如何在 Networkx 图中生成组件 ID?

django - 包含的 urlconf manager.urls 中没有任何模式

python - Django:递归获取模型字段(外键及其字段)作为字符串进入 1 级列表

python - 使用 Python 将数据字节 append 到二进制文件