Last active
June 16, 2017 20:06
-
-
Save LowerDeez/cfa382e2ae4aead0704dde49e18e313d to your computer and use it in GitHub Desktop.
Creating a model mixin to take care of meta tags
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This mixin adds four filds to the model that extends from it: meta_keywords, meta_ | |
description, meta_author, and meta_copyright. The methods to render the meta | |
tags in HTML are also added. | |
If you use this mixin in a model such as Idea, which is shown in the fist recipe of this | |
chapter, then you can put the following in the HEAD section of your detail page template | |
to render all the meta tags: | |
{{ idea.get_meta_tags }} | |
You can also render a specifi meta tag using the following line: | |
{{ idea.get_meta_description }} | |
As you may have noticed from the code snippet, the rendered meta tags are marked as safe, | |
that is, they are not escaped and we don't need to use the safe template fiter. Only the | |
values that come from the database are escaped in order to guarantee that the fial HTML | |
is well-formed. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# utils/models.py | |
# -*- coding: UTF-8 -*- | |
from __future__ import unicode_literals | |
from django.db import models | |
from django.utils.translation import ugettext_lazy as _ | |
from django.template.defaultfilters import escape | |
from django.utils.safestring import mark_safe | |
class MetaTagsMixin(models.Model): | |
""" | |
Abstract base class for meta tags in the <head> section | |
""" | |
meta_keywords = models.CharField( | |
_("Keywords"), | |
max_length=255, | |
blank=True, | |
help_text=_("Separate keywords by comma."), | |
) | |
meta_description = models.CharField( | |
_("Description"), | |
max_length=255, | |
blank=True, | |
) | |
meta_author = models.CharField( | |
_("Author"), | |
max_length=255, | |
blank=True, | |
) | |
meta_copyright = models.CharField( | |
_("Copyright"), | |
max_length=255, | |
blank=True, | |
) | |
class Meta: | |
abstract = True | |
def get_meta_keywords(self): | |
tag = "" | |
if self.meta_keywords: | |
tag = '<meta name="keywords" content="%s" />\n' % escape(self.meta_keywords) | |
return mark_safe(tag) | |
def get_meta_description(self): | |
tag = "" | |
if self.meta_description: | |
tag = '<meta name="description" content="%s" />\n' % escape(self.meta_description) | |
return mark_safe(tag) | |
def get_meta_author(self): | |
tag = "" | |
if self.meta_author: | |
tag = '<meta name="author" content="%s" />\n' % escape(self.meta_author) | |
return mark_safe(tag) | |
def get_meta_copyright(self): | |
tag = "" | |
if self.meta_copyright: | |
tag = '<meta name="copyright" content="%s" />\n' % \ | |
escape(self.meta_copyright) | |
return mark_safe(tag) | |
def get_meta_tags(self): | |
return mark_safe("".join(( | |
self.get_meta_keywords(), | |
self.get_meta_description(), | |
self.get_meta_author(), | |
self.get_meta_copyright(), | |
))) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment