Code a simple blog using Python and Django.

Django Blog | How to Make Your First Blog with Django

For anyone looking to code their own blog, Django is a useful tool for those who like to code using Python. As such, Django can essentially be used as building blocks to eliminate guesswork and save development time. In this post, we will explore the advantages of Django, how to utilize Django on a self-hosted VPS, and how to make a blog with Django.

What is Django?

Django is an open-source web framework, written in Python, that follows the model-view-template architectural pattern. Consequently, a web framework is just a set of components that help you to develop websites faster and easier. Basically, it is pre-made snippets of code, that have already been tested and debugged, that can be used alongside your own code. This allows for quick and easy setup of complex and intricate code without having to worry about developing the base or framework.

When building a website, one always needs a similar set of components: a way to handle user authentication (signing up, signing in, signing out), a management panel for your website, forms, a way to upload files, etc. Luckily, other people long ago noticed that web developers face similar problems when building a new site, so they teamed up and created frameworks (Django being one of them) that offer ready-made components to use.

Frameworks exist to save developers from having to reinvent the wheel and to help alleviate some of the overhead when building a new site using Django.

What is Python?

Python is an interpreted, object-oriented, high-level programming language with dynamic semantics. In other words, it is just another programming language and one of many options that developers have when looking at building a new site or web app. A few famous examples of websites built with python include Google, YouTube, DropBox, and Reddit. The biggest advantage that python has above all other programming languages and options is its speed. As a result, Python 3.5 typically comes in at almost a full THIRD of the time or faster, than a PHP 5.6 website would!

Python is an extremely versatile and powerful object-oriented language at that, which means that it can be used to make some pretty powerful web apps and programs.

Advantages of a Django Blog or Django Web App

The biggest advantage of using Django to make a blog or web app is pretty clear, it’s speed. However, that speed is two-fold when dealing with Django. First, it is in development, as you don’t need to reinvent the wheel, you will find that you just breeze through many of the cumbersome and time-consuming parts of development. Your new site or app will be able to soar farther and higher than ever before because it was built on the backs of giants. Most, if not all, of the work you’d be doing, will have already been done AND tested for you when you choose to work within a framework.

Second, speed in performance. Django is based in Python, which has time and time again outperformed both Ruby and PHP. In today’s day of mobile websites and apps, it is important that you are relaying data as quickly as possible with making as few and lightweight server calls as possible. You want to be sure that your clients don’t waste both time and precious data off their plans, just trying to load your website.

Django Tutorial: How to make a Blog with Django

How to make a Blog with Django.. Screenshot source: django-planet

Step 1: Installing Django

First login to your SkySilk dashboard and select “Create Container” then just select a plan.

 

When your plan is selected, choose a hardware configuration, or configure your own custom hardware.

Once you have your hardware configured, select “Apps and Tools” then find “Django” and select it.

Finally, just enter the required info and hit “Go!”

READ: Advantages to Turnkey Linux Applications on a SkySilk Linux VPS

Step 2: Starting The Application

Navigate to your project directory, this should contain a __init__.py, manage.py, settings.py and urls.py. There may also be a few others. For reference, my project name is djangorocks, you will need to replace any references to djangorocks throughout this tutorial.

In addition, type the following into terminal; this creates a new application folder & key files we will be using for our blog:

python manage.py startapp blog

As a result, you should now have a folder called blog containing 3 files: __init__.py, models.py and views.py.

Important:

Open up your settings.py, this is located in your project folder. Find INSTALLED_APPS and add ‘blog’. Consequently you should have something similar to the following;

INSTALLED_APPS = (

   'django.contrib.auth',

   'django.contrib.contenttypes',

   'django.contrib.sessions',
   
   'django.contrib.sites',

   'djangorocks.blog',

)

Django now knows about your new application, all that is left to do is create it.

Step 3: Define Your Models

The model is your database structure. Let’s start by opening the models.py file, and start adding some fields. Because this is meant to be a simple quide, it will not be including users at this stage.

class Blog(models.Model):
   title = models.CharField(max_length=100, unique=True)
   slug = models.SlugField(max_length=100, unique=True)
   body = models.TextField()
   posted = models.DateField(db_index=True, auto_now_add=True)
   category = models.ForeignKey('blog.Category')

class Category(models.Model):
   title = models.CharField(max_length=100, db_index=True)
   slug = models.SlugField(max_length=100, db_index=True)

This creates a database table with the name “Blog”. As a result, this need to be something obvious and will be used a lot.

class Blog(models.Model):

These are basic fields to be created in your database:

title = models.CharField(max_length=100, db_index=True)
slug = models.SlugField(max_length=100, db_index=True)
body = models.TextField()
posted = models.DateTimeField(db_index=True, auto_now_add=True)

The last field, a little more advanced. This field populates its data from another database table, in this case, Category, so you will need to populate the Category table field first.

category = models.ForeignKey('blog.Category')

Finishing Up

So, there are a few more things to be added to the model now that we have decided on the database structure. Your completed model file should look as follows.

from django.db import models
from django.db.models import permalink

# Create your models here.

class Blog(models.Model):
   title = models.CharField(max_length=100, unique=True)
   slug = models.SlugField(max_length=100, unique=True)
   body = models.TextField()
   posted = models.DateTimeField(db_index=True, auto_now_add=True)
   category = models.ForeignKey('blog.Category')

   def __unicode__(self):
       return '%s' % self.title

   @permalink
   def get_absolute_url(self):
       return ('view_blog_post', None, { 'slug': self.slug })

class Category(models.Model):
   title = models.CharField(max_length=100, db_index=True)
   slug = models.SlugField(max_length=100, db_index=True)

   def __unicode__(self):
       return '%s' % self.title

   @permalink
   def get_absolute_url(self):
       return ('view_blog_category', None, { 'slug': self.slug })

What are these extras for?

The __unicode__ function sets the text reference for each record. This is used mainly in the automated django admin, but this is still available to use on your own site.

The get_absolute_url function defines a URL, again used in the admin area, for each record.

Without the @permalink decorator, the following would not work. This returns a URL calculated from the urls.py file which will be explained shortly. I would recommend using this method as it allows you to change the URL for a page in only one location.

return ('view_blog_post', None, { 'slug': self.slug })

Example

Title: How to make a blog with Django

Response from __unicode__: How to make a blog with Django

Response from get_absolute_url: /blog/view/how-to-make-a-blog-with-django.html

Step 4: Configure the Auto-Admin

In many of your own applications, you will probably want to write your own administration functions:

Create admin.py in the blog folder we created earlier. This admin.py file is automatically checked by Django admin for every application defined under INSTALLED_APPS in the settings.py

from django.contrib import admin
from blog.models import Blog, Category

admin.site.register(Blog)
admin.site.register(Category)

Import the command which allows us to register the model we created

from django.contrib import admin

Also, Import our models

from blog.models import Blog, Category

Register our models Blog & Category with the admin

admin.site.register(Blog)
admin.site.register(Category)

Although these three lines are enough to get the admin working, we want to add a little more functionality. Heres the final admin.py.

from django.contrib import admin
from djangorocks.blog.models import Blog, Category

class BlogAdmin(admin.ModelAdmin):
   exclude = ['posted']
   prepopulated_fields = {'slug': ('title',)}

class CategoryAdmin(admin.ModelAdmin):
   prepopulated_fields = {'slug': ('title',)}

admin.site.register(Blog, BlogAdmin)
admin.site.register(Category, CategoryAdmin)

Now that you have added these models into the admin, you might want to log in and add a few categories and blog posts.

Step 5: Writing The Views

The view is where you do all the logic to be sent to your templates. In this example, we will not be dealing with RequestContext. As a result, this would give you access to the request object which contains details of the currently logged in user, as well as a few other features you will be likely to use in the future.

For this example, we need to create 3 views.

  • Display your categories & latest posts
  • Display the posts in a specific category
  • Display the post

Here is a copy of the view.py.

# Create your views here.

from djangorocks.blog.models import Blog, Category
from django.shortcuts import render_to_response, get_object_or_404

def index(request):
   return render_to_response('index.html', {
       'categories': Category.objects.all(),
       'posts': Blog.objects.all()[:5]
   })

def view_post(request, slug):   
   return render_to_response('view_post.html', {
       'post': get_object_or_404(Blog, slug=slug)
   })

def view_category(request, slug):
   category = get_object_or_404(Category, slug=slug)
   return render_to_response('view_category.html', {
       'category': category,
       'posts': Blog.objects.filter(category=category)[:5]
   })

As with the admin.py file we need to import the models.

from djangorocks.blog.models import Blog, Category

We also need to import a couple of functions for displaying our template.

from django.shortcuts import render_to_response, get_object_or_404

The following is for your index page, which will display a list of all your categories and 5 most recent posts.

When defining functions, you always need to specify the variable request. This is the request object, which contains details of the User, POST & GET data as well as a few other bits. In the following instance, we are also specifying slug which is mapped to from the urls.py file as you will see in a minute

def view_category(request, slug):

This first part sets the template file that we are going to be using.

render_to_response('test.html', {

The next part queries the database for both categories and posts. Category and Blog are the names of the models we created earlier.

'categories': Category.objects.all(),
'posts': Blog.objects.all()[:5]

In the other two functions view_post & view_category we use one of the rather useful Django shortcuts. This queries the database trying to match where slug=slug, the first slug being the field in the model, the second slug being the input into the function call, more on this in a second when we define the URLs.

get_object_or_404(Blog, slug=slug)

Step 6: Defining URLs

Open up the urls.py located in your project folder, add the following 3 lines.

(r'^

The first URL match is just a simple match nothing, ie http://www.yourdomain.com/, and mapping that through to the view index. The second two have custom variables being passed to the view. These are just regular expressions with the parameter matching the syntax of Django.

(?P<slug>[^\.]+)


Using the .html extension on URLs should work fine. This matches everything up to ‘.’, there are other ways of doing this, and it maps the result to slug which is also the name of a parameter in the view_post and view_category functions.

The final part labeled name is what we used when defining the models. get_absolute_url returns a URL automatically calculated based on the URL that is entered here. Defining this just once means that if you change the mapping URL, it will also change throughout the site. You are also able to use the template tag that Django provides to do a similar thing, however, this is not used in our example.

Step 7: Templating

The templating system in Django is extremely powerful, as a result, we will only be using a small handful of its functionality in this example.

First of all, let’s create our base template. This is just a very basic example, which is not valid XHTML. This template alone doesn’t do a great deal.

base.html

<html>
   <head>
       <title>{% block head_title %}Welcome to my blog{% endblock %}</title>
   </head>
   <body>
       <h1>{% block title %}Welcome to my block{% endblock %}</h1>
       {% block content %}

       {% endblock %}
   </body>
</html>
index.html

{% extends 'base.html' %}
{% block title %}Welcome to my blog{% endblock %}

{% block content %}
   <h2>Categories</h2>
   {% if categories %}
       <ul>
       {% for category in categories %}
           <li><a href="{{ category.get_absolute_url }}">{{ category.title }}</a></li>
       {% endfor %}
       </ul>
   {% else %}
       <p>There are no posts.</p>
   {% endif %}

   <h2>Posts</h2>
   {% if posts %}
       <ul>
       {% for post in posts %}
           <li><a href="{{ post.get_absolute_url }}">{{ post.title }}</a></li>
       {% endfor %}
       </ul>
   {% else %}
       <p>There are no posts.</p>
   {% endif %}

{% endblock %}

view_post.html

{% extends 'base.html' %} 
{% block head_title %}{{ post.title }}{% endblock %}
{% block title %}{{ post.title }}{% endblock %}

{% block content %}
   {{ post.body }}
{% endblock %}
view_category.html

{% extends 'base.html' %} 
{% block head_title %}Viewing category {{ category.title }}{% endblock %}
{% block title %}{{ category.title }}{% endblock %}

{% block content %}
   {% if posts %}
       <ul>
       {% for post in posts %}
           <li><a href="{{ post.get_absolute_url }}">{{ post.title }}</a></li>
       {% endfor %}
       </ul>
   {% else %}
       <p>There are no posts.</p>
   {% endif %}
{% endblock %}

So, In the base.html we are defining the base content, <html>, <body> etc, as well as the blocks we would like to display. Therefore, the content for these is output based on the content that extends the base template.

On the first line of all three of the other files, you will notice

{% extends 'base.html' %}

This line calls the base.html template file. Inside this we define the blocks very much the same way as in the base.html file, however this time we add the content we want to display. Using the example from index.html

We define the block for content:

{% block content %}
   ...
{% endblock %}

Inside here we are checking if there are any categories. Furthermore, the variables we use here were defined in the views.pyfile in the render_to_response function.

{% if categories %}
   ....
{% else %}
   <p>There are no posts.</p>
{% endif %}

If there are any categories, then the following is run:

<ul>
   {% for category in categories %}
       <li><a href="{{ category.get_absolute_url }}">{{ category.title }}</a></li>
   {% endfor %}
</ul>

Finally, his will loop the response from the Category model as defined in views.py, and print out the results that are entered into the database.

How to make a Blog with Django: Conclusion

Congratulations! You have made it all the way through the tutorial, and you should now be able to answer questions like:

What is Django?

What is Python?

What is a Web Framework?

How to Make a Blog Using Django?

With this knowledge, you can begin coding a blog with Django as the base of your web framework. Especially relevant, with a self-host SkySilk Linux VPS and Turnkey Django Template, you can deploy the exact resources you need for the project scope in a matter of second and furthermore, scale them as needed.

Deploy a Self Hosted Django VPS

, 'djangorocks.blog.views.index'), url(    r'^blog/view/(?P<slug>[^\.]+).html',    'djangorocks.blog.views.view_post',    name='view_blog_post'), url(    r'^blog/category/(?P<slug>[^\.]+).html',    'djangorocks.blog.views.view_category',    name='view_blog_category'),

The first URL match is just a simple match nothing, ie http://www.yourdomain.com/, and mapping that through to the view index. The second two have custom variables being passed to the view. These are just regular expressions with the parameter matching the syntax of Django.

 


Using the .html extension on URLs should work fine. This matches everything up to ‘.’, there are other ways of doing this, and it maps the result to slug which is also the name of a parameter in the view_post and view_category functions.

The final part labeled name is what we used when defining the models. get_absolute_url returns a URL automatically calculated based on the URL that is entered here. Defining this just once means that if you change the mapping URL, it will also change throughout the site. You are also able to use the template tag that Django provides to do a similar thing, however, this is not used in our example.

Step 7: Templating

The templating system in Django is extremely powerful, as a result, we will only be using a small handful of its functionality in this example.

First of all, let’s create our base template. This is just a very basic example, which is not valid XHTML. This template alone doesn’t do a great deal.

 
 
 
 

So, In the base.html we are defining the base content, <html>, <body> etc, as well as the blocks we would like to display. Therefore, the content for these is output based on the content that extends the base template.

On the first line of all three of the other files, you will notice

 

This line calls the base.html template file. Inside this we define the blocks very much the same way as in the base.html file, however this time we add the content we want to display. Using the example from index.html

We define the block for content:

 

Inside here we are checking if there are any categories. Furthermore, the variables we use here were defined in the views.pyfile in the render_to_response function.

 

If there are any categories, then the following is run:

 

Finally, his will loop the response from the Category model as defined in views.py, and print out the results that are entered into the database.

How to make a Blog with Django: Conclusion

Congratulations! You have made it all the way through the tutorial, and you should now be able to answer questions like:

What is Django?

What is Python?

What is a Web Framework?

How to Make a Blog Using Django?

With this knowledge, you can begin coding a blog with Django as the base of your web framework. Especially relevant, with a self-host SkySilk Linux VPS and Turnkey Django Template, you can deploy the exact resources you need for the project scope in a matter of second and furthermore, scale them as needed.

Deploy a Self Hosted Django VPS

Share this post with your friends