mkdir blog
cd blog
virtualenv venv
source venv/bin/activate
pip install django==1.6
pip install django-file-picker
pip install django-bootstrap-toolkit
pip install PIL
hash -r
django-admin.py startproject blog_system
cd blog_system/
mkdir templates
export DJANGO_SETTINGS_MODULE="blog_system.settings"
export PYTHONPATH="$PYTHONPATH:'pwd'"
django-admin.py startapp blog
git init
git add .
git commit -m "Initial commit"
django-admin.py syncdb
django-admin.py runserver 0.0.0.0:80
urls.py
from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
url(r'^$', 'blog.views.home', name='home'),
# url(r'^blog/', include('blog.urls')),
url(r'^blog/(?P<slug>[-\w]+)/$','blog.views.blog',name='home'),
url(r'^admin/', include(admin.site.urls)),
)
settings.py
TEMPLATE_DIRS=[
os.path.join(BASE_DIR,'templates'),
]
# Application definition
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'file_picker',
'file_picker.uploads',
'file_picker.wymeditor',
'bootstrap_toolkit',
'blog',
'django.contrib.admin',
)
blog/admin.py
from django.contrib import admin
from blog.models import Blog
from django.db.models import TextField
from file_picker.wymeditor.widgets import WYMeditorWidget
class BlogAdmin(admin.ModelAdmin):
prepopulated_fields={'slug':('title',)}
list_display=('title','time')
formfield_overrides={TextField:{'widget':WYMeditorWidget({}) }}
class Media:
js=('http://libs.baidu.com/jquerytools/1.2.7/jquery.tools.min.js',)
admin.site.register(Blog,BlogAdmin)
blog/models.py
from django.db import models
# Create your models here.
class Blog(models.Model):
time =models.DateTimeField(auto_now_add = True)
title =models.CharField(max_length=100)
slug =models.SlugField()
perex =models.TextField()
content =models.TextField()
@models.permalink
def get_absolute_url(self):
return ('blog',[self.slug])
def __unicode__(self):
return self.title
class Meta:
ordering =['-time']
blog/views.py
from django.shortcuts import render,get_object_or_404
from django.template.response import TemplateResponse
from blog.models import Blog
# Create your views here.
def home(request):
return TemplateResponse(request,"home.html",{'blog':Blog.objects.all()})
def blog(request,slug):
blog=get_object_or_404(Blog,slug=slug)
return TemplateResonse(request,"blog.html",{'blog':blog})
templates/base.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>My Blog</title>
{% load bootstrap_toolkit %}{% bootstrap_stylesheet_tag %}
<style type="text/css" media="screen">
.container{width:800px;}
.navbar .container {width:800px;}
</style>
</head>
<body>
<div class="navbar navbar-inverse">
<div class="navbar-inner">
<div class="container">
<a class="brand" href="/">My Blog</a>
</div>
</div>
</div>
<div class="container">
<div id="content" class="flex">
{% block content %}
{% endblock %}
</div>
</div>
</body>
</html>
templates/blog.html
{% extends "base.html" %}
{% block content %}
<h1>{ <small>{{ blog.time }}</small> }</h1>
{{ blog.perex|safe }}<hr/>
{{ blog.content|safe }}
{% endblock %}
templates/home.html
{% extends "base.html" %}
{% block content %}
<div class="hero-unit">
<h1>My Blogs</h1>
<p>Text ...</p>
<p><a class="btn btn-primary btn-large" href="">Learn more</a></p>
</div>
{% for blog in blogs %}
<h2>{{ blog }} <small>{{ blog.time }}</small> </h2>
{{ blog.perex|safe }}
<a class="btn" href="{{ blog.get_absolute_url }}">Read more</a>
{% endfor %}
{% endblock %}
效果如图