我正在尝试将外部数据集成到我的元标记中。我想要实现的目标 - 通过在标题字段(在管理中)输入“{{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/