Chapter 1

Getting Started

Add Open Graph meta tags to your Django app

Create a connection

  1. Sign in to OpenGraph+
  2. Go to your website’s Meta Tags page
  3. Create a new connection and copy your connection URL

Your connection URL looks like https://$OGPLUS_KEY.ogplus.net.

Find your base template

Django uses template inheritance. Your base template is typically templates/base.html. All other templates extend it with {% extends "base.html" %}.

Add Open Graph meta tags

Add the following meta tags to your base template’s <head>. These control how your pages appear when shared on Twitter, Slack, LinkedIn, and other platforms.

<!-- templates/base.html -->
<html>
  <head>
    <meta property="og:title" content="{% block og_title %}My Site{% endblock %}">
    <meta property="og:description" content="{% block og_description %}Welcome to my site{% endblock %}">
    <meta property="og:url" content="{{ request.build_absolute_uri }}">
    <meta property="og:site_name" content="My Site">
    <meta property="og:type" content="{% block og_type %}website{% endblock %}">
    <meta property="og:image" content="https://$OGPLUS_KEY.ogplus.net{{ request.path }}">
    <meta name="twitter:card" content="summary_large_image">
  </head>
  <body>
    {% block content %}{% endblock %}
  </body>
</html>

Replace https://$OGPLUS_KEY.ogplus.net with your connection URL, and "My Site" with your actual site name.

What each tag does

Tag Purpose
og:title The title shown in the link preview
og:description The description shown below the title
og:url The canonical URL of the page
og:site_name Your website’s name
og:type Content type (website, article, product)
og:image The social card image (powered by OpenGraph+)
twitter:card Tells Twitter to show a large image card

Dynamic tags from views

Override the blocks in child templates to set page-specific values from your model data:

Blog posts

<!-- templates/blog/post_detail.html -->
{% extends "base.html" %}

{% block og_title %}{{ post.title }}{% endblock %}
{% block og_description %}{{ post.excerpt }}{% endblock %}
{% block og_type %}article{% endblock %}

{% block content %}
  <h1>{{ post.title }}</h1>
  <p>{{ post.body }}</p>
{% endblock %}

Products

<!-- templates/products/product_detail.html -->
{% extends "base.html" %}

{% block og_title %}{{ product.name }}{% endblock %}
{% block og_description %}{{ product.price }} — {{ product.description }}{% endblock %}
{% block og_type %}product{% endblock %}

{% block content %}
  <h1>{{ product.name }}</h1>
{% endblock %}

Enable the request context processor

request.path and request.build_absolute_uri require the django.template.context_processors.request context processor. This is enabled by default in new Django projects. If it’s not present, add it:

# settings.py
TEMPLATES = [
    {
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.request',
                # ... other processors
            ],
        },
    },
]

Verify

Start your development server and view the page source. Check that all og: meta tags are present with the correct values.

Open the preview tool in your OpenGraph+ dashboard and paste a URL from your site to see the social card image.