├── .gitignore ├── Procfile ├── README.md ├── article ├── __init__.py ├── admin.py ├── article_cache.py ├── forms.py ├── migrations │ ├── 0001_initial.py │ └── __init__.py ├── models.py ├── tests.py └── views.py ├── django_blog ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py ├── gitpush.sh ├── manage.py ├── requirements.txt ├── start.sh ├── static ├── css │ ├── blog.css │ ├── grids-responsive-min.css │ └── pure-min.css └── img │ ├── Login.png │ ├── aboutme.png │ ├── apple-touch-icon-114.png │ ├── archive.ico │ ├── blog_add.png │ ├── homepage.jpg │ ├── logo.png │ ├── rss.png │ └── selflogo.jpg ├── style └── code.css └── templates ├── about.html ├── archives.html ├── base.html ├── edit.html ├── home.html ├── newblog.html ├── post.html ├── post_modify.html ├── post_success.html ├── registration └── login.html └── tag.html /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | db.sqlite3 3 | /migrations/* 4 | venv 5 | /media/* 6 | .idea/* 7 | /mdedia/* 8 | 9 | .DS_Store 10 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: gunicorn django_blog.wsgi -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # django_blog 2 | A person blog developed by django 3 | 4 | 博客简易功能 5 | 6 | 1)添加新博客,博客内容能进行富文本编辑 7 | 8 | 2)分页浏览博客 9 | 10 | 3)修改博客标题、内容、分类 11 | 12 | 4)增加权限限制,必须登陆才能创建修改内容 13 | 14 | 5)Disqus评论 15 | 16 | 其他新功能会看情况添加 17 | 18 | 项目已经部署在heroku上,地址 https://allenzhao.herokuapp.com 19 | 20 | 欢迎star和pr 21 | 22 | -------------------------------------------------------------------------------- /article/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boyxiaolong/django_blog/304d45b4c7536956df3a2e2c0caba433e9d7462a/article/__init__.py -------------------------------------------------------------------------------- /article/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django_summernote.admin import SummernoteModelAdmin 3 | # Register your models here. 4 | import models 5 | 6 | admin.site.register(models.Article) -------------------------------------------------------------------------------- /article/article_cache.py: -------------------------------------------------------------------------------- 1 | class post_object: 2 | id = 0 3 | content = "" 4 | date = "" 5 | tag = "" 6 | 7 | class article_cache: 8 | is_inited = False 9 | article_achive_list = {} -------------------------------------------------------------------------------- /article/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | import models 3 | from django_summernote.widgets import SummernoteWidget, SummernoteInplaceWidget 4 | 5 | class ImageUploadForm(forms.Form): 6 | """Image upload form.""" 7 | image = forms.ImageField() 8 | 9 | class ArticleForm(forms.Form): 10 | content = forms.CharField(widget=SummernoteWidget()) 11 | 12 | class ArticleWigetForm(forms.ModelForm): 13 | class Meta: 14 | model = models.Article 15 | exclude = ['date_time'] 16 | widgets = { 17 | 'content' : SummernoteWidget(), 18 | } -------------------------------------------------------------------------------- /article/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ] 11 | 12 | operations = [ 13 | migrations.CreateModel( 14 | name='Article', 15 | fields=[ 16 | ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), 17 | ('title', models.CharField(max_length=100)), 18 | ('content', models.TextField(null=True, blank=True)), 19 | ('category', models.CharField(max_length=50, blank=True)), 20 | ('date_time', models.DateTimeField(auto_now_add=True)), 21 | ('readnum', models.IntegerField(default=0, null=True, blank=True)), 22 | ], 23 | options={ 24 | 'ordering': ['-date_time'], 25 | }, 26 | ), 27 | ] 28 | -------------------------------------------------------------------------------- /article/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boyxiaolong/django_blog/304d45b4c7536956df3a2e2c0caba433e9d7462a/article/migrations/__init__.py -------------------------------------------------------------------------------- /article/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.core.urlresolvers import reverse 3 | 4 | # Create your models here. 5 | class Article(models.Model) : 6 | title = models.CharField(max_length = 100) 7 | content = models.TextField(blank = True, null = True) 8 | category = models.CharField(max_length = 50, blank = True) 9 | date_time = models.DateTimeField(auto_now_add = True) 10 | readnum = models.IntegerField(blank = True, null = True, default=0) 11 | 12 | def __str__(self) : 13 | return self.title 14 | 15 | def get_ori_url(self): 16 | return "http://0.0.0.1:8000/" 17 | def get_absolute_url(self): 18 | path = reverse('detail', kwargs={'id':self.id}) 19 | return "http://0.0.0.1:8000%s"%path 20 | class Meta: 21 | ordering = ['-date_time'] -------------------------------------------------------------------------------- /article/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /article/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | 3 | import models 4 | from django.http import HttpResponse, HttpResponseForbidden, HttpResponseRedirect 5 | import logging 6 | from django.core.context_processors import csrf 7 | from django.views.generic import FormView,DetailView,ListView 8 | import forms 9 | from django.forms import ModelForm 10 | from django.contrib import auth 11 | from django.shortcuts import render_to_response 12 | from django.contrib.auth.decorators import login_required 13 | from django.contrib.syndication.views import Feed 14 | from django.utils.feedgenerator import Atom1Feed 15 | from django.contrib.sites.models import get_current_site 16 | from django.core.paginator import Paginator 17 | from django.core.paginator import EmptyPage 18 | from django.core.paginator import PageNotAnInteger 19 | 20 | logger = logging.getLogger(__name__) 21 | 22 | # Create your views here. 23 | def home(request): 24 | return index(request) 25 | 26 | def about(request): 27 | print "about" 28 | return render(request, 'about.html') 29 | 30 | def detail(request, id): 31 | try: 32 | post = models.Article.objects.get(id=str(id)) 33 | except Article.DoesNotExist: 34 | raise Http404 35 | post.readnum = post.readnum + 1 36 | post.save() 37 | return render(request, 'post_modify.html', {'post' : post}) 38 | 39 | def archives(request): 40 | try: 41 | post_list = models.Article.objects.all() 42 | except models.Article.DoesNotExist: 43 | return Http404 44 | return render(request, 'archives.html', {'post_list':post_list, 45 | 'error':False}) 46 | 47 | def search_category(request, category) : 48 | try: 49 | post_list = models.Article.objects.filter(category__iexact = category) #contains 50 | except models.Article.DoesNotExist : 51 | raise Http404 52 | return render(request, 'tag.html', {'post_list' : post_list}) 53 | 54 | def blog_search(request): 55 | s = request.GET['search_text'] 56 | if not s: 57 | return render(request, 'home.html') 58 | else: 59 | post_list = models.Article.objects.filter(title__contains=s) 60 | status = True 61 | if len(post_list) > 0: 62 | status = False 63 | return render(request, 'archives.html', {'post_list':post_list, 'error':status}) 64 | 65 | @login_required 66 | def create_blog(request): 67 | if request.POST: 68 | c = {} 69 | c.update(csrf(request)) 70 | title = request.POST.get('title', "") 71 | tag = request.POST.get("tag", "") 72 | form = forms.ArticleForm(request.POST) 73 | content = "" 74 | if form.is_valid(): 75 | content = form.cleaned_data['content'] 76 | if len(title) > 0: 77 | new_post,create = models.Article.objects.update_or_create(title=title, category=tag, content=content) 78 | new_post.save() 79 | return render(request, 'post_modify.html', {'post' : new_post}) 80 | return render(request, "post_success.html", c) 81 | else: 82 | form = forms.ArticleForm() 83 | return render(request, 'newblog.html', {'form':form}) 84 | 85 | @login_required 86 | def modify(request, id): 87 | try: 88 | post = models.Article.objects.get(id=str(id)) 89 | except models.Article.DoesNotExist: 90 | raise Http404 91 | if request.POST: 92 | title = request.POST.get('title', "") 93 | content = request.POST.get('content', "") 94 | category = request.POST.get("category", "") 95 | post.title = title 96 | post.content = content 97 | post.category = category 98 | post.save() 99 | return render(request, "post_modify.html", {'post':post}) 100 | else: 101 | form = forms.ArticleWigetForm(instance=post) 102 | return render(request, "edit.html", {'post':post, 'form':form}) 103 | 104 | class PostRssFeed(Feed): 105 | feed_type = Atom1Feed 106 | title = u'AllenZhao \'s Blog' 107 | link = 'http://' + get_current_site(None).domain 108 | description = u'Welcome to AllenZhao \'s Blog' 109 | author = 'AllenZhao' 110 | 111 | def items(self): 112 | return models.Article.objects.all().order_by('-date_time')[:10] 113 | 114 | def item_title(self, item): 115 | return item.title 116 | 117 | def item_pubdate(self, item): 118 | return item.date_time 119 | 120 | def item_description(self, item): 121 | return item.content 122 | 123 | class PostAtomFeed(PostRssFeed): 124 | feed_type = Atom1Feed 125 | subtitle = PostRssFeed.item_description 126 | 127 | def index(request): 128 | limit = 3 129 | topics = models.Article.objects.all() 130 | paginator = Paginator(topics, limit) 131 | page = request.GET.get('page') 132 | try: 133 | topics = paginator.page(page) 134 | except PageNotAnInteger: 135 | topics = paginator.page(1) 136 | except EmptyPage: 137 | topics = paginator.page(paginator.num_pages) 138 | 139 | return render_to_response('home.html', {'post_list': topics}) 140 | 141 | def delete(request, id): 142 | try: 143 | post = models.Article.objects.get(id=str(id)) 144 | except models.Article.DoesNotExist: 145 | raise Http404 146 | post.delete() 147 | return render(request, "post_success.html", {'content':"delete post success"}) 148 | -------------------------------------------------------------------------------- /django_blog/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boyxiaolong/django_blog/304d45b4c7536956df3a2e2c0caba433e9d7462a/django_blog/__init__.py -------------------------------------------------------------------------------- /django_blog/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Django settings for django_blog project. 3 | 4 | Generated by 'django-admin startproject' using Django 1.8.3. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/1.8/topics/settings/ 8 | 9 | For the full list of settings and their values, see 10 | https://docs.djangoproject.com/en/1.8/ref/settings/ 11 | """ 12 | 13 | # Build paths inside the project like this: os.path.join(BASE_DIR, ...) 14 | import os 15 | 16 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 17 | 18 | 19 | # Quick-start development settings - unsuitable for production 20 | # See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/ 21 | 22 | # SECURITY WARNING: keep the secret key used in production secret! 23 | SECRET_KEY = 'p)b&b(h%2*p@o2^n(x722hnmqg@r*-fmp694&($spa3^tlezlj' 24 | 25 | # SECURITY WARNING: don't run with debug turned on in production! 26 | DEBUG = True 27 | 28 | ALLOWED_HOSTS = [] 29 | 30 | ON_HEROKU = os.environ.get('ON_HEROKU') 31 | HEROKU_SERVER = os.environ.get('HEROKU_SERVER') 32 | 33 | # Application definition 34 | 35 | INSTALLED_APPS = ( 36 | 'bootstrap_admin', 37 | 'django_markdown', 38 | 'django.contrib.admin', 39 | 'django.contrib.auth', 40 | 'django.contrib.contenttypes', 41 | 'django.contrib.sessions', 42 | 'django.contrib.messages', 43 | 'django.contrib.staticfiles', 44 | 'django_summernote', 45 | 'django.contrib.sites', 46 | 'disqus', 47 | 'article', 48 | ) 49 | 50 | MIDDLEWARE_CLASSES = ( 51 | 'django.contrib.sessions.middleware.SessionMiddleware', 52 | 'django.middleware.common.CommonMiddleware', 53 | #'django.middleware.csrf.CsrfViewMiddleware', 54 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 55 | 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 56 | 'django.contrib.messages.middleware.MessageMiddleware', 57 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 58 | 'django.middleware.security.SecurityMiddleware', 59 | ) 60 | 61 | ROOT_URLCONF = 'django_blog.urls' 62 | TEMPLATES = [ 63 | { 64 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 65 | 'DIRS': [os.path.join(BASE_DIR, 'templates').replace('\\','/')], 66 | 'APP_DIRS': True, 67 | 'OPTIONS': { 68 | 'context_processors': [ 69 | 'django.template.context_processors.debug', 70 | 'django.template.context_processors.request', 71 | 'django.contrib.auth.context_processors.auth', 72 | 'django.contrib.messages.context_processors.messages', 73 | ], 74 | }, 75 | }, 76 | ] 77 | 78 | WSGI_APPLICATION = 'django_blog.wsgi.application' 79 | 80 | 81 | # Database 82 | # https://docs.djangoproject.com/en/1.8/ref/settings/#databases 83 | import dj_database_url 84 | if ON_HEROKU: 85 | DATABASES = { 86 | 'default': dj_database_url.config() 87 | } 88 | else: 89 | DATABASES = { 90 | 'default': { 91 | 'ENGINE': 'django.db.backends.sqlite3', 92 | 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 93 | 'USER': '', 94 | 'PASSWORD': '', 95 | 'HOST': '', # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP. 96 | 'PORT': '', 97 | } 98 | } 99 | 100 | # Honor the 'X-Forwarded-Proto' header for request.is_secure(). 101 | SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') 102 | 103 | # Allow all host headers. 104 | ALLOWED_HOSTS = ['*'] 105 | 106 | 107 | # Internationalization 108 | # https://docs.djangoproject.com/en/1.8/topics/i18n/ 109 | 110 | LANGUAGE_CODE = 'en-us' 111 | 112 | TIME_ZONE = 'UTC' 113 | 114 | USE_I18N = True 115 | 116 | USE_L10N = True 117 | 118 | USE_TZ = True 119 | 120 | 121 | # Static files (CSS, JavaScript, Images) 122 | # https://docs.djangoproject.com/en/1.8/howto/static-files/ 123 | 124 | STATIC_URL = '/static/' 125 | STATIC_ROOT = os.path.join(BASE_DIR, 'commonstatic') 126 | MEDIA_ROOT = os.path.join(BASE_DIR, "mdedia") 127 | MEDIA_URL = '/media/' 128 | LOGIN_REDIRECT_URL = "/home/" 129 | STATICFILES_DIRS = ( 130 | os.path.join(BASE_DIR, 'static'), 131 | ) 132 | DISQUS_API_KEY = os.environ.get('DISQUS_API_KEY') 133 | DISQUS_WEBSITE_SHORTNAME = 'allenzhao_blog' 134 | SITE_ID = 1 -------------------------------------------------------------------------------- /django_blog/urls.py: -------------------------------------------------------------------------------- 1 | """django_blog URL Configuration 2 | 3 | The `urlpatterns` list routes URLs to views. For more information please see: 4 | https://docs.djangoproject.com/en/1.8/topics/http/urls/ 5 | Examples: 6 | Function views 7 | 1. Add an import: from my_app import views 8 | 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') 9 | Class-based views 10 | 1. Add an import: from other_app.views import Home 11 | 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') 12 | Including another URLconf 13 | 1. Add an import: from blog import urls as blog_urls 14 | 2. Add a URL to urlpatterns: url(r'^blog/', include(blog_urls)) 15 | """ 16 | from django.conf import settings 17 | from django.conf.urls.static import static 18 | from django.conf.urls import include, url 19 | from django.contrib import admin 20 | from django.contrib.staticfiles.urls import staticfiles_urlpatterns 21 | from article.views import PostRssFeed 22 | from django.contrib.syndication.views import Feed 23 | 24 | urlpatterns = [ 25 | url(r'^admin/', include(admin.site.urls)), 26 | url('^static/','django.views.static.serve',{'document_root':settings.STATIC_ROOT},name='static'), 27 | url(r'^$', 'article.views.home', name='home'), 28 | url(r'^create_blog/$', 'article.views.create_blog', name = 'create_blog'), 29 | url(r'^search/','article.views.blog_search', name = 'search'), 30 | url(r'^about/$', 'article.views.about', name='about'), 31 | url(r'^feed/$', PostRssFeed(), name = "RSS"), 32 | url(r'^(?P\d+)/$', 'article.views.detail', name='detail'), 33 | url(r'^archives/$', 'article.views.archives', name = 'archives'), 34 | url(r'^(?P[\w\-]+)/$', 'article.views.search_category', name = 'search_category'), 35 | url(r'^modify/(?P\d+)/$', 'article.views.modify', name="modify"), 36 | url(r'^delete/(?P\d+)/$', 'article.views.delete', name="delete"), 37 | url('^accounts/', include('django.contrib.auth.urls')), 38 | url(r'^summernote/', include('django_summernote.urls')), 39 | ]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) -------------------------------------------------------------------------------- /django_blog/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for django_blog project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/1.8/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_blog.settings") 15 | 16 | from django.core.wsgi import get_wsgi_application 17 | from dj_static import Cling 18 | 19 | application = Cling(get_wsgi_application()) 20 | -------------------------------------------------------------------------------- /gitpush.sh: -------------------------------------------------------------------------------- 1 | git commit -a -m "modify" 2 | git push heroku master 3 | heroku ps:scale web=1 4 | heroku open 5 | -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import os 3 | import sys 4 | 5 | if __name__ == "__main__": 6 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_blog.settings") 7 | 8 | from django.core.management import execute_from_command_line 9 | 10 | execute_from_command_line(sys.argv) 11 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | bootstrap-admin==0.3.6 2 | disqus-python==0.4.2 3 | dj-database-url==0.3.0 4 | dj-static==0.0.6 5 | Django==1.8.3 6 | django-disqus==0.5 7 | django-markdown==0.8.4 8 | django-summernote==0.7.0 9 | django-toolbelt==0.0.1 10 | funcsigs==0.4 11 | gunicorn==19.4.3 12 | Markdown==2.6.5 13 | mock==1.3.0 14 | pbr==1.8.1 15 | simplejson==3.8.1 16 | six==1.10.0 17 | static3==0.6.1 18 | wheel==0.24.0 19 | -------------------------------------------------------------------------------- /start.sh: -------------------------------------------------------------------------------- 1 | python manage.py runserver 2 | -------------------------------------------------------------------------------- /static/css/blog.css: -------------------------------------------------------------------------------- 1 | * { 2 | -webkit-box-sizing: border-box; 3 | -moz-box-sizing: border-box; 4 | box-sizing: border-box; 5 | } 6 | 7 | a { 8 | text-decoration: none; 9 | color: rgb(47, 215, 156); 10 | } 11 | a:hover, 12 | a:focus { 13 | text-decoration: underline; 14 | } 15 | 16 | h3 { 17 | font-weight: 100; 18 | } 19 | 20 | /* LAYOUT CSS */ 21 | .pure-img-responsive { 22 | max-width: 100%; 23 | height: auto; 24 | } 25 | 26 | #layout { 27 | padding: 0; 28 | } 29 | 30 | .header { 31 | text-align: center; 32 | top: auto; 33 | margin: 3em auto; 34 | } 35 | 36 | .sidebar { 37 | background: rgb(100, 104, 162); 38 | color: #fff; 39 | float: none; 40 | } 41 | 42 | .brand-title, 43 | .brand-tagline { 44 | margin: 0; 45 | } 46 | .brand-title { 47 | margin-top:20px; 48 | text-transform: uppercase; 49 | } 50 | .brand-tagline { 51 | margin-top:20px; 52 | font-weight: 300; 53 | color: rgb(176, 202, 219); 54 | margin-bottom:20px; 55 | } 56 | 57 | .nav-list { 58 | margin: 0; 59 | padding: 0; 60 | list-style: none; 61 | } 62 | .nav-item { 63 | display: inline-block; 64 | *display: inline; 65 | zoom: 1; 66 | } 67 | .nav-item a { 68 | background: transparent; 69 | border: 2px solid rgb(176, 202, 219); 70 | color: #fff; 71 | margin-top: 1em; 72 | letter-spacing: 0.05em; 73 | text-transform: uppercase; 74 | font-size: 85%; 75 | } 76 | .nav-item a:hover, 77 | .nav-item a:focus { 78 | border: 2px solid rgb(61, 146, 201); 79 | text-decoration: none; 80 | } 81 | 82 | .content-subhead { 83 | text-transform: uppercase; 84 | color: #aaa; 85 | border-bottom: 1px solid #eee; 86 | padding: 0.4em 0; 87 | font-size: 80%; 88 | font-weight: 500; 89 | letter-spacing: 0.1em; 90 | } 91 | 92 | .content { 93 | padding: 2em 1em 0; 94 | } 95 | 96 | .post { 97 | padding-bottom: 2em; 98 | } 99 | .post-title { 100 | font-size: 2em; 101 | color: #222; 102 | font-weight:bold; 103 | margin-bottom: 0.2em; 104 | } 105 | .post-avatar { 106 | border-radius: 50px; 107 | float: right; 108 | margin-left: 1em; 109 | } 110 | .post-description { 111 | font-family: Georgia, "Cambria", serif; 112 | color: #444; 113 | line-height: 1.8em; 114 | } 115 | .post-meta { 116 | color: #999; 117 | font-size: 90%; 118 | margin: 0; 119 | } 120 | 121 | .post-category { 122 | margin: 0 0.1em; 123 | padding: 0.3em 1em; 124 | color: #fff; 125 | background: #999; 126 | font-size: 80%; 127 | } 128 | .post-category-design { 129 | background: #5aba59; 130 | } 131 | .post-category-pure { 132 | background: #4d85d1; 133 | } 134 | .post-category-yui { 135 | background: #8156a7; 136 | } 137 | .post-category-js { 138 | background: #df2d4f; 139 | } 140 | 141 | .post-images { 142 | margin: 1em 0; 143 | } 144 | .post-image-meta { 145 | margin-top: -3.5em; 146 | margin-left: 1em; 147 | color: #fff; 148 | text-shadow: 0 1px 1px #333; 149 | } 150 | 151 | .footer { 152 | text-align: center; 153 | padding: 1em 0; 154 | } 155 | .footer a { 156 | font-size: 5em; 157 | color: #444; 158 | font-size: 80%; 159 | } 160 | .footer .pure-menu a:hover, 161 | .footer .pure-menu a:focus { 162 | background: none; 163 | } 164 | 165 | ul { list-style: none;} 166 | 167 | @media (min-width: 48em) { 168 | .content { 169 | padding: 2em 3em 0; 170 | margin-left: 25%; 171 | } 172 | 173 | .header { 174 | margin: 80% 2em 0; 175 | text-align: right; 176 | } 177 | 178 | .sidebar { 179 | position: fixed; 180 | top: 0; 181 | bottom: 0; 182 | } 183 | } -------------------------------------------------------------------------------- /static/css/grids-responsive-min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | Pure v0.6.0 3 | Copyright 2014 Yahoo! Inc. All rights reserved. 4 | Licensed under the BSD License. 5 | https://github.com/yahoo/pure/blob/master/LICENSE.md 6 | */ 7 | @media screen and (min-width:35.5em){.pure-u-sm-1,.pure-u-sm-1-1,.pure-u-sm-1-2,.pure-u-sm-1-3,.pure-u-sm-2-3,.pure-u-sm-1-4,.pure-u-sm-3-4,.pure-u-sm-1-5,.pure-u-sm-2-5,.pure-u-sm-3-5,.pure-u-sm-4-5,.pure-u-sm-5-5,.pure-u-sm-1-6,.pure-u-sm-5-6,.pure-u-sm-1-8,.pure-u-sm-3-8,.pure-u-sm-5-8,.pure-u-sm-7-8,.pure-u-sm-1-12,.pure-u-sm-5-12,.pure-u-sm-7-12,.pure-u-sm-11-12,.pure-u-sm-1-24,.pure-u-sm-2-24,.pure-u-sm-3-24,.pure-u-sm-4-24,.pure-u-sm-5-24,.pure-u-sm-6-24,.pure-u-sm-7-24,.pure-u-sm-8-24,.pure-u-sm-9-24,.pure-u-sm-10-24,.pure-u-sm-11-24,.pure-u-sm-12-24,.pure-u-sm-13-24,.pure-u-sm-14-24,.pure-u-sm-15-24,.pure-u-sm-16-24,.pure-u-sm-17-24,.pure-u-sm-18-24,.pure-u-sm-19-24,.pure-u-sm-20-24,.pure-u-sm-21-24,.pure-u-sm-22-24,.pure-u-sm-23-24,.pure-u-sm-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-sm-1-24{width:4.1667%;*width:4.1357%}.pure-u-sm-1-12,.pure-u-sm-2-24{width:8.3333%;*width:8.3023%}.pure-u-sm-1-8,.pure-u-sm-3-24{width:12.5%;*width:12.469%}.pure-u-sm-1-6,.pure-u-sm-4-24{width:16.6667%;*width:16.6357%}.pure-u-sm-1-5{width:20%;*width:19.969%}.pure-u-sm-5-24{width:20.8333%;*width:20.8023%}.pure-u-sm-1-4,.pure-u-sm-6-24{width:25%;*width:24.969%}.pure-u-sm-7-24{width:29.1667%;*width:29.1357%}.pure-u-sm-1-3,.pure-u-sm-8-24{width:33.3333%;*width:33.3023%}.pure-u-sm-3-8,.pure-u-sm-9-24{width:37.5%;*width:37.469%}.pure-u-sm-2-5{width:40%;*width:39.969%}.pure-u-sm-5-12,.pure-u-sm-10-24{width:41.6667%;*width:41.6357%}.pure-u-sm-11-24{width:45.8333%;*width:45.8023%}.pure-u-sm-1-2,.pure-u-sm-12-24{width:50%;*width:49.969%}.pure-u-sm-13-24{width:54.1667%;*width:54.1357%}.pure-u-sm-7-12,.pure-u-sm-14-24{width:58.3333%;*width:58.3023%}.pure-u-sm-3-5{width:60%;*width:59.969%}.pure-u-sm-5-8,.pure-u-sm-15-24{width:62.5%;*width:62.469%}.pure-u-sm-2-3,.pure-u-sm-16-24{width:66.6667%;*width:66.6357%}.pure-u-sm-17-24{width:70.8333%;*width:70.8023%}.pure-u-sm-3-4,.pure-u-sm-18-24{width:75%;*width:74.969%}.pure-u-sm-19-24{width:79.1667%;*width:79.1357%}.pure-u-sm-4-5{width:80%;*width:79.969%}.pure-u-sm-5-6,.pure-u-sm-20-24{width:83.3333%;*width:83.3023%}.pure-u-sm-7-8,.pure-u-sm-21-24{width:87.5%;*width:87.469%}.pure-u-sm-11-12,.pure-u-sm-22-24{width:91.6667%;*width:91.6357%}.pure-u-sm-23-24{width:95.8333%;*width:95.8023%}.pure-u-sm-1,.pure-u-sm-1-1,.pure-u-sm-5-5,.pure-u-sm-24-24{width:100%}}@media screen and (min-width:48em){.pure-u-md-1,.pure-u-md-1-1,.pure-u-md-1-2,.pure-u-md-1-3,.pure-u-md-2-3,.pure-u-md-1-4,.pure-u-md-3-4,.pure-u-md-1-5,.pure-u-md-2-5,.pure-u-md-3-5,.pure-u-md-4-5,.pure-u-md-5-5,.pure-u-md-1-6,.pure-u-md-5-6,.pure-u-md-1-8,.pure-u-md-3-8,.pure-u-md-5-8,.pure-u-md-7-8,.pure-u-md-1-12,.pure-u-md-5-12,.pure-u-md-7-12,.pure-u-md-11-12,.pure-u-md-1-24,.pure-u-md-2-24,.pure-u-md-3-24,.pure-u-md-4-24,.pure-u-md-5-24,.pure-u-md-6-24,.pure-u-md-7-24,.pure-u-md-8-24,.pure-u-md-9-24,.pure-u-md-10-24,.pure-u-md-11-24,.pure-u-md-12-24,.pure-u-md-13-24,.pure-u-md-14-24,.pure-u-md-15-24,.pure-u-md-16-24,.pure-u-md-17-24,.pure-u-md-18-24,.pure-u-md-19-24,.pure-u-md-20-24,.pure-u-md-21-24,.pure-u-md-22-24,.pure-u-md-23-24,.pure-u-md-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-md-1-24{width:4.1667%;*width:4.1357%}.pure-u-md-1-12,.pure-u-md-2-24{width:8.3333%;*width:8.3023%}.pure-u-md-1-8,.pure-u-md-3-24{width:12.5%;*width:12.469%}.pure-u-md-1-6,.pure-u-md-4-24{width:16.6667%;*width:16.6357%}.pure-u-md-1-5{width:20%;*width:19.969%}.pure-u-md-5-24{width:20.8333%;*width:20.8023%}.pure-u-md-1-4,.pure-u-md-6-24{width:25%;*width:24.969%}.pure-u-md-7-24{width:29.1667%;*width:29.1357%}.pure-u-md-1-3,.pure-u-md-8-24{width:33.3333%;*width:33.3023%}.pure-u-md-3-8,.pure-u-md-9-24{width:37.5%;*width:37.469%}.pure-u-md-2-5{width:40%;*width:39.969%}.pure-u-md-5-12,.pure-u-md-10-24{width:41.6667%;*width:41.6357%}.pure-u-md-11-24{width:45.8333%;*width:45.8023%}.pure-u-md-1-2,.pure-u-md-12-24{width:50%;*width:49.969%}.pure-u-md-13-24{width:54.1667%;*width:54.1357%}.pure-u-md-7-12,.pure-u-md-14-24{width:58.3333%;*width:58.3023%}.pure-u-md-3-5{width:60%;*width:59.969%}.pure-u-md-5-8,.pure-u-md-15-24{width:62.5%;*width:62.469%}.pure-u-md-2-3,.pure-u-md-16-24{width:66.6667%;*width:66.6357%}.pure-u-md-17-24{width:70.8333%;*width:70.8023%}.pure-u-md-3-4,.pure-u-md-18-24{width:75%;*width:74.969%}.pure-u-md-19-24{width:79.1667%;*width:79.1357%}.pure-u-md-4-5{width:80%;*width:79.969%}.pure-u-md-5-6,.pure-u-md-20-24{width:83.3333%;*width:83.3023%}.pure-u-md-7-8,.pure-u-md-21-24{width:87.5%;*width:87.469%}.pure-u-md-11-12,.pure-u-md-22-24{width:91.6667%;*width:91.6357%}.pure-u-md-23-24{width:95.8333%;*width:95.8023%}.pure-u-md-1,.pure-u-md-1-1,.pure-u-md-5-5,.pure-u-md-24-24{width:100%}}@media screen and (min-width:64em){.pure-u-lg-1,.pure-u-lg-1-1,.pure-u-lg-1-2,.pure-u-lg-1-3,.pure-u-lg-2-3,.pure-u-lg-1-4,.pure-u-lg-3-4,.pure-u-lg-1-5,.pure-u-lg-2-5,.pure-u-lg-3-5,.pure-u-lg-4-5,.pure-u-lg-5-5,.pure-u-lg-1-6,.pure-u-lg-5-6,.pure-u-lg-1-8,.pure-u-lg-3-8,.pure-u-lg-5-8,.pure-u-lg-7-8,.pure-u-lg-1-12,.pure-u-lg-5-12,.pure-u-lg-7-12,.pure-u-lg-11-12,.pure-u-lg-1-24,.pure-u-lg-2-24,.pure-u-lg-3-24,.pure-u-lg-4-24,.pure-u-lg-5-24,.pure-u-lg-6-24,.pure-u-lg-7-24,.pure-u-lg-8-24,.pure-u-lg-9-24,.pure-u-lg-10-24,.pure-u-lg-11-24,.pure-u-lg-12-24,.pure-u-lg-13-24,.pure-u-lg-14-24,.pure-u-lg-15-24,.pure-u-lg-16-24,.pure-u-lg-17-24,.pure-u-lg-18-24,.pure-u-lg-19-24,.pure-u-lg-20-24,.pure-u-lg-21-24,.pure-u-lg-22-24,.pure-u-lg-23-24,.pure-u-lg-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-lg-1-24{width:4.1667%;*width:4.1357%}.pure-u-lg-1-12,.pure-u-lg-2-24{width:8.3333%;*width:8.3023%}.pure-u-lg-1-8,.pure-u-lg-3-24{width:12.5%;*width:12.469%}.pure-u-lg-1-6,.pure-u-lg-4-24{width:16.6667%;*width:16.6357%}.pure-u-lg-1-5{width:20%;*width:19.969%}.pure-u-lg-5-24{width:20.8333%;*width:20.8023%}.pure-u-lg-1-4,.pure-u-lg-6-24{width:25%;*width:24.969%}.pure-u-lg-7-24{width:29.1667%;*width:29.1357%}.pure-u-lg-1-3,.pure-u-lg-8-24{width:33.3333%;*width:33.3023%}.pure-u-lg-3-8,.pure-u-lg-9-24{width:37.5%;*width:37.469%}.pure-u-lg-2-5{width:40%;*width:39.969%}.pure-u-lg-5-12,.pure-u-lg-10-24{width:41.6667%;*width:41.6357%}.pure-u-lg-11-24{width:45.8333%;*width:45.8023%}.pure-u-lg-1-2,.pure-u-lg-12-24{width:50%;*width:49.969%}.pure-u-lg-13-24{width:54.1667%;*width:54.1357%}.pure-u-lg-7-12,.pure-u-lg-14-24{width:58.3333%;*width:58.3023%}.pure-u-lg-3-5{width:60%;*width:59.969%}.pure-u-lg-5-8,.pure-u-lg-15-24{width:62.5%;*width:62.469%}.pure-u-lg-2-3,.pure-u-lg-16-24{width:66.6667%;*width:66.6357%}.pure-u-lg-17-24{width:70.8333%;*width:70.8023%}.pure-u-lg-3-4,.pure-u-lg-18-24{width:75%;*width:74.969%}.pure-u-lg-19-24{width:79.1667%;*width:79.1357%}.pure-u-lg-4-5{width:80%;*width:79.969%}.pure-u-lg-5-6,.pure-u-lg-20-24{width:83.3333%;*width:83.3023%}.pure-u-lg-7-8,.pure-u-lg-21-24{width:87.5%;*width:87.469%}.pure-u-lg-11-12,.pure-u-lg-22-24{width:91.6667%;*width:91.6357%}.pure-u-lg-23-24{width:95.8333%;*width:95.8023%}.pure-u-lg-1,.pure-u-lg-1-1,.pure-u-lg-5-5,.pure-u-lg-24-24{width:100%}}@media screen and (min-width:80em){.pure-u-xl-1,.pure-u-xl-1-1,.pure-u-xl-1-2,.pure-u-xl-1-3,.pure-u-xl-2-3,.pure-u-xl-1-4,.pure-u-xl-3-4,.pure-u-xl-1-5,.pure-u-xl-2-5,.pure-u-xl-3-5,.pure-u-xl-4-5,.pure-u-xl-5-5,.pure-u-xl-1-6,.pure-u-xl-5-6,.pure-u-xl-1-8,.pure-u-xl-3-8,.pure-u-xl-5-8,.pure-u-xl-7-8,.pure-u-xl-1-12,.pure-u-xl-5-12,.pure-u-xl-7-12,.pure-u-xl-11-12,.pure-u-xl-1-24,.pure-u-xl-2-24,.pure-u-xl-3-24,.pure-u-xl-4-24,.pure-u-xl-5-24,.pure-u-xl-6-24,.pure-u-xl-7-24,.pure-u-xl-8-24,.pure-u-xl-9-24,.pure-u-xl-10-24,.pure-u-xl-11-24,.pure-u-xl-12-24,.pure-u-xl-13-24,.pure-u-xl-14-24,.pure-u-xl-15-24,.pure-u-xl-16-24,.pure-u-xl-17-24,.pure-u-xl-18-24,.pure-u-xl-19-24,.pure-u-xl-20-24,.pure-u-xl-21-24,.pure-u-xl-22-24,.pure-u-xl-23-24,.pure-u-xl-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-xl-1-24{width:4.1667%;*width:4.1357%}.pure-u-xl-1-12,.pure-u-xl-2-24{width:8.3333%;*width:8.3023%}.pure-u-xl-1-8,.pure-u-xl-3-24{width:12.5%;*width:12.469%}.pure-u-xl-1-6,.pure-u-xl-4-24{width:16.6667%;*width:16.6357%}.pure-u-xl-1-5{width:20%;*width:19.969%}.pure-u-xl-5-24{width:20.8333%;*width:20.8023%}.pure-u-xl-1-4,.pure-u-xl-6-24{width:25%;*width:24.969%}.pure-u-xl-7-24{width:29.1667%;*width:29.1357%}.pure-u-xl-1-3,.pure-u-xl-8-24{width:33.3333%;*width:33.3023%}.pure-u-xl-3-8,.pure-u-xl-9-24{width:37.5%;*width:37.469%}.pure-u-xl-2-5{width:40%;*width:39.969%}.pure-u-xl-5-12,.pure-u-xl-10-24{width:41.6667%;*width:41.6357%}.pure-u-xl-11-24{width:45.8333%;*width:45.8023%}.pure-u-xl-1-2,.pure-u-xl-12-24{width:50%;*width:49.969%}.pure-u-xl-13-24{width:54.1667%;*width:54.1357%}.pure-u-xl-7-12,.pure-u-xl-14-24{width:58.3333%;*width:58.3023%}.pure-u-xl-3-5{width:60%;*width:59.969%}.pure-u-xl-5-8,.pure-u-xl-15-24{width:62.5%;*width:62.469%}.pure-u-xl-2-3,.pure-u-xl-16-24{width:66.6667%;*width:66.6357%}.pure-u-xl-17-24{width:70.8333%;*width:70.8023%}.pure-u-xl-3-4,.pure-u-xl-18-24{width:75%;*width:74.969%}.pure-u-xl-19-24{width:79.1667%;*width:79.1357%}.pure-u-xl-4-5{width:80%;*width:79.969%}.pure-u-xl-5-6,.pure-u-xl-20-24{width:83.3333%;*width:83.3023%}.pure-u-xl-7-8,.pure-u-xl-21-24{width:87.5%;*width:87.469%}.pure-u-xl-11-12,.pure-u-xl-22-24{width:91.6667%;*width:91.6357%}.pure-u-xl-23-24{width:95.8333%;*width:95.8023%}.pure-u-xl-1,.pure-u-xl-1-1,.pure-u-xl-5-5,.pure-u-xl-24-24{width:100%}} -------------------------------------------------------------------------------- /static/css/pure-min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | Pure v0.6.0 3 | Copyright 2014 Yahoo! Inc. All rights reserved. 4 | Licensed under the BSD License. 5 | https://github.com/yahoo/pure/blob/master/LICENSE.md 6 | */ 7 | /*! 8 | normalize.css v^3.0 | MIT License | git.io/normalize 9 | Copyright (c) Nicolas Gallagher and Jonathan Neal 10 | */ 11 | /*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}.hidden,[hidden]{display:none!important}.pure-img{max-width:100%;height:auto;display:block}.pure-g{letter-spacing:-.31em;*letter-spacing:normal;*word-spacing:-.43em;text-rendering:optimizespeed;font-family:FreeSans,Arimo,"Droid Sans",Helvetica,Arial,sans-serif;display:-webkit-flex;-webkit-flex-flow:row wrap;display:-ms-flexbox;-ms-flex-flow:row wrap;-ms-align-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start}.opera-only :-o-prefocus,.pure-g{word-spacing:-.43em}.pure-u{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-g [class *="pure-u"]{font-family:sans-serif}.pure-u-1,.pure-u-1-1,.pure-u-1-2,.pure-u-1-3,.pure-u-2-3,.pure-u-1-4,.pure-u-3-4,.pure-u-1-5,.pure-u-2-5,.pure-u-3-5,.pure-u-4-5,.pure-u-5-5,.pure-u-1-6,.pure-u-5-6,.pure-u-1-8,.pure-u-3-8,.pure-u-5-8,.pure-u-7-8,.pure-u-1-12,.pure-u-5-12,.pure-u-7-12,.pure-u-11-12,.pure-u-1-24,.pure-u-2-24,.pure-u-3-24,.pure-u-4-24,.pure-u-5-24,.pure-u-6-24,.pure-u-7-24,.pure-u-8-24,.pure-u-9-24,.pure-u-10-24,.pure-u-11-24,.pure-u-12-24,.pure-u-13-24,.pure-u-14-24,.pure-u-15-24,.pure-u-16-24,.pure-u-17-24,.pure-u-18-24,.pure-u-19-24,.pure-u-20-24,.pure-u-21-24,.pure-u-22-24,.pure-u-23-24,.pure-u-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-1-24{width:4.1667%;*width:4.1357%}.pure-u-1-12,.pure-u-2-24{width:8.3333%;*width:8.3023%}.pure-u-1-8,.pure-u-3-24{width:12.5%;*width:12.469%}.pure-u-1-6,.pure-u-4-24{width:16.6667%;*width:16.6357%}.pure-u-1-5{width:20%;*width:19.969%}.pure-u-5-24{width:20.8333%;*width:20.8023%}.pure-u-1-4,.pure-u-6-24{width:25%;*width:24.969%}.pure-u-7-24{width:29.1667%;*width:29.1357%}.pure-u-1-3,.pure-u-8-24{width:33.3333%;*width:33.3023%}.pure-u-3-8,.pure-u-9-24{width:37.5%;*width:37.469%}.pure-u-2-5{width:40%;*width:39.969%}.pure-u-5-12,.pure-u-10-24{width:41.6667%;*width:41.6357%}.pure-u-11-24{width:45.8333%;*width:45.8023%}.pure-u-1-2,.pure-u-12-24{width:50%;*width:49.969%}.pure-u-13-24{width:54.1667%;*width:54.1357%}.pure-u-7-12,.pure-u-14-24{width:58.3333%;*width:58.3023%}.pure-u-3-5{width:60%;*width:59.969%}.pure-u-5-8,.pure-u-15-24{width:62.5%;*width:62.469%}.pure-u-2-3,.pure-u-16-24{width:66.6667%;*width:66.6357%}.pure-u-17-24{width:70.8333%;*width:70.8023%}.pure-u-3-4,.pure-u-18-24{width:75%;*width:74.969%}.pure-u-19-24{width:79.1667%;*width:79.1357%}.pure-u-4-5{width:80%;*width:79.969%}.pure-u-5-6,.pure-u-20-24{width:83.3333%;*width:83.3023%}.pure-u-7-8,.pure-u-21-24{width:87.5%;*width:87.469%}.pure-u-11-12,.pure-u-22-24{width:91.6667%;*width:91.6357%}.pure-u-23-24{width:95.8333%;*width:95.8023%}.pure-u-1,.pure-u-1-1,.pure-u-5-5,.pure-u-24-24{width:100%}.pure-button{display:inline-block;zoom:1;line-height:normal;white-space:nowrap;vertical-align:middle;text-align:center;cursor:pointer;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.pure-button::-moz-focus-inner{padding:0;border:0}.pure-button{font-family:inherit;font-size:100%;padding:.5em 1em;color:#444;color:rgba(0,0,0,.8);border:1px solid #999;border:0 rgba(0,0,0,0);background-color:#E6E6E6;text-decoration:none;border-radius:2px}.pure-button-hover,.pure-button:hover,.pure-button:focus{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#1a000000', GradientType=0);background-image:-webkit-gradient(linear,0 0,0 100%,from(transparent),color-stop(40%,rgba(0,0,0,.05)),to(rgba(0,0,0,.1)));background-image:-webkit-linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1));background-image:-moz-linear-gradient(top,rgba(0,0,0,.05) 0,rgba(0,0,0,.1));background-image:-o-linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1));background-image:linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1))}.pure-button:focus{outline:0}.pure-button-active,.pure-button:active{box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 0 6px rgba(0,0,0,.2) inset;border-color:#000\9}.pure-button[disabled],.pure-button-disabled,.pure-button-disabled:hover,.pure-button-disabled:focus,.pure-button-disabled:active{border:0;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);filter:alpha(opacity=40);-khtml-opacity:.4;-moz-opacity:.4;opacity:.4;cursor:not-allowed;box-shadow:none}.pure-button-hidden{display:none}.pure-button::-moz-focus-inner{padding:0;border:0}.pure-button-primary,.pure-button-selected,a.pure-button-primary,a.pure-button-selected{background-color:#0078e7;color:#fff}.pure-form input[type=text],.pure-form input[type=password],.pure-form input[type=email],.pure-form input[type=url],.pure-form input[type=date],.pure-form input[type=month],.pure-form input[type=time],.pure-form input[type=datetime],.pure-form input[type=datetime-local],.pure-form input[type=week],.pure-form input[type=number],.pure-form input[type=search],.pure-form input[type=tel],.pure-form input[type=color],.pure-form select,.pure-form textarea{padding:.5em .6em;display:inline-block;border:1px solid #ccc;box-shadow:inset 0 1px 3px #ddd;border-radius:4px;vertical-align:middle;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.pure-form input:not([type]){padding:.5em .6em;display:inline-block;border:1px solid #ccc;box-shadow:inset 0 1px 3px #ddd;border-radius:4px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.pure-form input[type=color]{padding:.2em .5em}.pure-form input[type=text]:focus,.pure-form input[type=password]:focus,.pure-form input[type=email]:focus,.pure-form input[type=url]:focus,.pure-form input[type=date]:focus,.pure-form input[type=month]:focus,.pure-form input[type=time]:focus,.pure-form input[type=datetime]:focus,.pure-form input[type=datetime-local]:focus,.pure-form input[type=week]:focus,.pure-form input[type=number]:focus,.pure-form input[type=search]:focus,.pure-form input[type=tel]:focus,.pure-form input[type=color]:focus,.pure-form select:focus,.pure-form textarea:focus{outline:0;border-color:#129FEA}.pure-form input:not([type]):focus{outline:0;border-color:#129FEA}.pure-form input[type=file]:focus,.pure-form input[type=radio]:focus,.pure-form input[type=checkbox]:focus{outline:thin solid #129FEA;outline:1px auto #129FEA}.pure-form .pure-checkbox,.pure-form .pure-radio{margin:.5em 0;display:block}.pure-form input[type=text][disabled],.pure-form input[type=password][disabled],.pure-form input[type=email][disabled],.pure-form input[type=url][disabled],.pure-form input[type=date][disabled],.pure-form input[type=month][disabled],.pure-form input[type=time][disabled],.pure-form input[type=datetime][disabled],.pure-form input[type=datetime-local][disabled],.pure-form input[type=week][disabled],.pure-form input[type=number][disabled],.pure-form input[type=search][disabled],.pure-form input[type=tel][disabled],.pure-form input[type=color][disabled],.pure-form select[disabled],.pure-form textarea[disabled]{cursor:not-allowed;background-color:#eaeded;color:#cad2d3}.pure-form input:not([type])[disabled]{cursor:not-allowed;background-color:#eaeded;color:#cad2d3}.pure-form input[readonly],.pure-form select[readonly],.pure-form textarea[readonly]{background-color:#eee;color:#777;border-color:#ccc}.pure-form input:focus:invalid,.pure-form textarea:focus:invalid,.pure-form select:focus:invalid{color:#b94a48;border-color:#e9322d}.pure-form input[type=file]:focus:invalid:focus,.pure-form input[type=radio]:focus:invalid:focus,.pure-form input[type=checkbox]:focus:invalid:focus{outline-color:#e9322d}.pure-form select{height:2.25em;border:1px solid #ccc;background-color:#fff}.pure-form select[multiple]{height:auto}.pure-form label{margin:.5em 0 .2em}.pure-form fieldset{margin:0;padding:.35em 0 .75em;border:0}.pure-form legend{display:block;width:100%;padding:.3em 0;margin-bottom:.3em;color:#333;border-bottom:1px solid #e5e5e5}.pure-form-stacked input[type=text],.pure-form-stacked input[type=password],.pure-form-stacked input[type=email],.pure-form-stacked input[type=url],.pure-form-stacked input[type=date],.pure-form-stacked input[type=month],.pure-form-stacked input[type=time],.pure-form-stacked input[type=datetime],.pure-form-stacked input[type=datetime-local],.pure-form-stacked input[type=week],.pure-form-stacked input[type=number],.pure-form-stacked input[type=search],.pure-form-stacked input[type=tel],.pure-form-stacked input[type=color],.pure-form-stacked input[type=file],.pure-form-stacked select,.pure-form-stacked label,.pure-form-stacked textarea{display:block;margin:.25em 0}.pure-form-stacked input:not([type]){display:block;margin:.25em 0}.pure-form-aligned input,.pure-form-aligned textarea,.pure-form-aligned select,.pure-form-aligned .pure-help-inline,.pure-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.pure-form-aligned textarea{vertical-align:top}.pure-form-aligned .pure-control-group{margin-bottom:.5em}.pure-form-aligned .pure-control-group label{text-align:right;display:inline-block;vertical-align:middle;width:10em;margin:0 1em 0 0}.pure-form-aligned .pure-controls{margin:1.5em 0 0 11em}.pure-form input.pure-input-rounded,.pure-form .pure-input-rounded{border-radius:2em;padding:.5em 1em}.pure-form .pure-group fieldset{margin-bottom:10px}.pure-form .pure-group input,.pure-form .pure-group textarea{display:block;padding:10px;margin:0 0 -1px;border-radius:0;position:relative;top:-1px}.pure-form .pure-group input:focus,.pure-form .pure-group textarea:focus{z-index:3}.pure-form .pure-group input:first-child,.pure-form .pure-group textarea:first-child{top:1px;border-radius:4px 4px 0 0;margin:0}.pure-form .pure-group input:first-child:last-child,.pure-form .pure-group textarea:first-child:last-child{top:1px;border-radius:4px;margin:0}.pure-form .pure-group input:last-child,.pure-form .pure-group textarea:last-child{top:-2px;border-radius:0 0 4px 4px;margin:0}.pure-form .pure-group button{margin:.35em 0}.pure-form .pure-input-1{width:100%}.pure-form .pure-input-2-3{width:66%}.pure-form .pure-input-1-2{width:50%}.pure-form .pure-input-1-3{width:33%}.pure-form .pure-input-1-4{width:25%}.pure-form .pure-help-inline,.pure-form-message-inline{display:inline-block;padding-left:.3em;color:#666;vertical-align:middle;font-size:.875em}.pure-form-message{display:block;color:#666;font-size:.875em}@media only screen and (max-width :480px){.pure-form button[type=submit]{margin:.7em 0 0}.pure-form input:not([type]),.pure-form input[type=text],.pure-form input[type=password],.pure-form input[type=email],.pure-form input[type=url],.pure-form input[type=date],.pure-form input[type=month],.pure-form input[type=time],.pure-form input[type=datetime],.pure-form input[type=datetime-local],.pure-form input[type=week],.pure-form input[type=number],.pure-form input[type=search],.pure-form input[type=tel],.pure-form input[type=color],.pure-form label{margin-bottom:.3em;display:block}.pure-group input:not([type]),.pure-group input[type=text],.pure-group input[type=password],.pure-group input[type=email],.pure-group input[type=url],.pure-group input[type=date],.pure-group input[type=month],.pure-group input[type=time],.pure-group input[type=datetime],.pure-group input[type=datetime-local],.pure-group input[type=week],.pure-group input[type=number],.pure-group input[type=search],.pure-group input[type=tel],.pure-group input[type=color]{margin-bottom:0}.pure-form-aligned .pure-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.pure-form-aligned .pure-controls{margin:1.5em 0 0}.pure-form .pure-help-inline,.pure-form-message-inline,.pure-form-message{display:block;font-size:.75em;padding:.2em 0 .8em}}.pure-menu{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.pure-menu-fixed{position:fixed;left:0;top:0;z-index:3}.pure-menu-list,.pure-menu-item{position:relative}.pure-menu-list{list-style:none;margin:0;padding:0}.pure-menu-item{padding:0;margin:0;height:100%}.pure-menu-link,.pure-menu-heading{display:block;text-decoration:none;white-space:nowrap}.pure-menu-horizontal{width:100%;white-space:nowrap}.pure-menu-horizontal .pure-menu-list{display:inline-block}.pure-menu-horizontal .pure-menu-item,.pure-menu-horizontal .pure-menu-heading,.pure-menu-horizontal .pure-menu-separator{display:inline-block;*display:inline;zoom:1;vertical-align:middle}.pure-menu-item .pure-menu-item{display:block}.pure-menu-children{display:none;position:absolute;left:100%;top:0;margin:0;padding:0;z-index:3}.pure-menu-horizontal .pure-menu-children{left:0;top:auto;width:inherit}.pure-menu-allow-hover:hover>.pure-menu-children,.pure-menu-active>.pure-menu-children{display:block;position:absolute}.pure-menu-has-children>.pure-menu-link:after{padding-left:.5em;content:"\25B8";font-size:small}.pure-menu-horizontal .pure-menu-has-children>.pure-menu-link:after{content:"\25BE"}.pure-menu-scrollable{overflow-y:scroll;overflow-x:hidden}.pure-menu-scrollable .pure-menu-list{display:block}.pure-menu-horizontal.pure-menu-scrollable .pure-menu-list{display:inline-block}.pure-menu-horizontal.pure-menu-scrollable{white-space:nowrap;overflow-y:hidden;overflow-x:auto;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;padding:.5em 0}.pure-menu-horizontal.pure-menu-scrollable::-webkit-scrollbar{display:none}.pure-menu-separator{background-color:#ccc;height:1px;margin:.3em 0}.pure-menu-horizontal .pure-menu-separator{width:1px;height:1.3em;margin:0 .3em}.pure-menu-heading{text-transform:uppercase;color:#565d64}.pure-menu-link{color:#777}.pure-menu-children{background-color:#fff}.pure-menu-link,.pure-menu-disabled,.pure-menu-heading{padding:.5em 1em}.pure-menu-disabled{opacity:.5}.pure-menu-disabled .pure-menu-link:hover{background-color:transparent}.pure-menu-active>.pure-menu-link,.pure-menu-link:hover,.pure-menu-link:focus{background-color:#eee}.pure-menu-selected .pure-menu-link,.pure-menu-selected .pure-menu-link:visited{color:#000}.pure-table{border-collapse:collapse;border-spacing:0;empty-cells:show;border:1px solid #cbcbcb}.pure-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.pure-table td,.pure-table th{border-left:1px solid #cbcbcb;border-width:0 0 0 1px;font-size:inherit;margin:0;overflow:visible;padding:.5em 1em}.pure-table td:first-child,.pure-table th:first-child{border-left-width:0}.pure-table thead{background-color:#e0e0e0;color:#000;text-align:left;vertical-align:bottom}.pure-table td{background-color:transparent}.pure-table-odd td{background-color:#f2f2f2}.pure-table-striped tr:nth-child(2n-1) td{background-color:#f2f2f2}.pure-table-bordered td{border-bottom:1px solid #cbcbcb}.pure-table-bordered tbody>tr:last-child>td{border-bottom-width:0}.pure-table-horizontal td,.pure-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #cbcbcb}.pure-table-horizontal tbody>tr:last-child>td{border-bottom-width:0} -------------------------------------------------------------------------------- /static/img/Login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boyxiaolong/django_blog/304d45b4c7536956df3a2e2c0caba433e9d7462a/static/img/Login.png -------------------------------------------------------------------------------- /static/img/aboutme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boyxiaolong/django_blog/304d45b4c7536956df3a2e2c0caba433e9d7462a/static/img/aboutme.png -------------------------------------------------------------------------------- /static/img/apple-touch-icon-114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boyxiaolong/django_blog/304d45b4c7536956df3a2e2c0caba433e9d7462a/static/img/apple-touch-icon-114.png -------------------------------------------------------------------------------- /static/img/archive.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boyxiaolong/django_blog/304d45b4c7536956df3a2e2c0caba433e9d7462a/static/img/archive.ico -------------------------------------------------------------------------------- /static/img/blog_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boyxiaolong/django_blog/304d45b4c7536956df3a2e2c0caba433e9d7462a/static/img/blog_add.png -------------------------------------------------------------------------------- /static/img/homepage.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boyxiaolong/django_blog/304d45b4c7536956df3a2e2c0caba433e9d7462a/static/img/homepage.jpg -------------------------------------------------------------------------------- /static/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boyxiaolong/django_blog/304d45b4c7536956df3a2e2c0caba433e9d7462a/static/img/logo.png -------------------------------------------------------------------------------- /static/img/rss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boyxiaolong/django_blog/304d45b4c7536956df3a2e2c0caba433e9d7462a/static/img/rss.png -------------------------------------------------------------------------------- /static/img/selflogo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boyxiaolong/django_blog/304d45b4c7536956df3a2e2c0caba433e9d7462a/static/img/selflogo.jpg -------------------------------------------------------------------------------- /style/code.css: -------------------------------------------------------------------------------- 1 | .codehilite .hll { background-color: #ffffcc } 2 | .codehilite { background: #f8f8f8; } 3 | .codehilite .c { color: #408080; font-style: italic } /* Comment */ 4 | .codehilite .err { border: 1px solid #FF0000 } /* Error */ 5 | .codehilite .k { color: #008000; font-weight: bold } /* Keyword */ 6 | .codehilite .o { color: #666666 } /* Operator */ 7 | .codehilite .cm { color: #408080; font-style: italic } /* Comment.Multiline */ 8 | .codehilite .cp { color: #BC7A00 } /* Comment.Preproc */ 9 | .codehilite .c1 { color: #408080; font-style: italic } /* Comment.Single */ 10 | .codehilite .cs { color: #408080; font-style: italic } /* Comment.Special */ 11 | .codehilite .gd { color: #A00000 } /* Generic.Deleted */ 12 | .codehilite .ge { font-style: italic } /* Generic.Emph */ 13 | .codehilite .gr { color: #FF0000 } /* Generic.Error */ 14 | .codehilite .gh { color: #000080; font-weight: bold } /* Generic.Heading */ 15 | .codehilite .gi { color: #00A000 } /* Generic.Inserted */ 16 | .codehilite .go { color: #888888 } /* Generic.Output */ 17 | .codehilite .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ 18 | .codehilite .gs { font-weight: bold } /* Generic.Strong */ 19 | .codehilite .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ 20 | .codehilite .gt { color: #0044DD } /* Generic.Traceback */ 21 | .codehilite .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ 22 | .codehilite .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ 23 | .codehilite .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ 24 | .codehilite .kp { color: #008000 } /* Keyword.Pseudo */ 25 | .codehilite .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ 26 | .codehilite .kt { color: #B00040 } /* Keyword.Type */ 27 | .codehilite .m { color: #666666 } /* Literal.Number */ 28 | .codehilite .s { color: #BA2121 } /* Literal.String */ 29 | .codehilite .na { color: #7D9029 } /* Name.Attribute */ 30 | .codehilite .nb { color: #008000 } /* Name.Builtin */ 31 | .codehilite .nc { color: #0000FF; font-weight: bold } /* Name.Class */ 32 | .codehilite .no { color: #880000 } /* Name.Constant */ 33 | .codehilite .nd { color: #AA22FF } /* Name.Decorator */ 34 | .codehilite .ni { color: #999999; font-weight: bold } /* Name.Entity */ 35 | .codehilite .ne { color: #D2413A; font-weight: bold } /* Name.Exception */ 36 | .codehilite .nf { color: #0000FF } /* Name.Function */ 37 | .codehilite .nl { color: #A0A000 } /* Name.Label */ 38 | .codehilite .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ 39 | .codehilite .nt { color: #008000; font-weight: bold } /* Name.Tag */ 40 | .codehilite .nv { color: #19177C } /* Name.Variable */ 41 | .codehilite .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ 42 | .codehilite .w { color: #bbbbbb } /* Text.Whitespace */ 43 | .codehilite .mb { color: #666666 } /* Literal.Number.Bin */ 44 | .codehilite .mf { color: #666666 } /* Literal.Number.Float */ 45 | .codehilite .mh { color: #666666 } /* Literal.Number.Hex */ 46 | .codehilite .mi { color: #666666 } /* Literal.Number.Integer */ 47 | .codehilite .mo { color: #666666 } /* Literal.Number.Oct */ 48 | .codehilite .sb { color: #BA2121 } /* Literal.String.Backtick */ 49 | .codehilite .sc { color: #BA2121 } /* Literal.String.Char */ 50 | .codehilite .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ 51 | .codehilite .s2 { color: #BA2121 } /* Literal.String.Double */ 52 | .codehilite .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */ 53 | .codehilite .sh { color: #BA2121 } /* Literal.String.Heredoc */ 54 | .codehilite .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */ 55 | .codehilite .sx { color: #008000 } /* Literal.String.Other */ 56 | .codehilite .sr { color: #BB6688 } /* Literal.String.Regex */ 57 | .codehilite .s1 { color: #BA2121 } /* Literal.String.Single */ 58 | .codehilite .ss { color: #19177C } /* Literal.String.Symbol */ 59 | .codehilite .bp { color: #008000 } /* Name.Builtin.Pseudo */ 60 | .codehilite .vc { color: #19177C } /* Name.Variable.Class */ 61 | .codehilite .vg { color: #19177C } /* Name.Variable.Global */ 62 | .codehilite .vi { color: #19177C } /* Name.Variable.Instance */ 63 | .codehilite .il { color: #666666 } /* Literal.Number.Integer.Long */ 64 | -------------------------------------------------------------------------------- /templates/about.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load django_markdown %} 3 | 4 | {% block content %} 5 |
6 |

我叫Allen,这是我的个人博客.目前居住在成都,爱好搬砖(虽然很弱),网球(初级,如果同城可以约球),徒步(已经爬过周边的一些山)

7 | You can mail to me to the datail 8 |
9 | {% endblock %} -------------------------------------------------------------------------------- /templates/archives.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block content %} 4 |
5 | {% for post in post_list %} 6 |
7 |
8 |

{{ post.title }}

9 | 10 | 13 |
14 |
15 | {% endfor %} 16 |
17 | {% endblock %} -------------------------------------------------------------------------------- /templates/base.html: -------------------------------------------------------------------------------- 1 | 2 | {% load staticfiles%} 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Allen Zhao Blog 11 | 12 | 13 | 14 | 15 | 16 | {{ form.media }} 17 | 18 | 19 |
20 | 194 | 195 | 196 |
197 |
198 | {% block content %} 199 | {% endblock %} 200 | 207 |
208 |
209 |
210 | 211 | 212 | -------------------------------------------------------------------------------- /templates/edit.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% load django_markdown %} 4 | {% block content %} 5 | 6 |
7 | {% csrf_token %} 8 | {% for field in form %} 9 | 10 |

{{ field.label_tag }}

11 |

{{ field }}

12 | 13 | {% endfor %} 14 | 15 |
16 | 17 | {% endblock %} -------------------------------------------------------------------------------- /templates/home.html: -------------------------------------------------------------------------------- 1 | 2 | {% extends "base.html" %} 3 | 4 | {% block content %} 5 |
6 | {% for post in post_list %} 7 |
8 |
9 |

{{ post.title }}

10 | 11 | 16 |
17 | 18 |
19 |

20 | {{ post.content|truncatechars_html:100|safe }} 21 |

22 |
23 | Read More >>> 24 |
25 | {% endfor %} 26 |

27 | {% if post_list.has_previous %} 28 | Previous 29 | {% endif %} 30 | {% if post_list.has_next %} 31 | Next 32 | {% endif %} 33 |

34 |
35 | {% endblock %} -------------------------------------------------------------------------------- /templates/newblog.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% load django_markdown %} 4 | {% block content %} 5 |
{% csrf_token %} 6 |

7 | 标题 : 8 |

9 | {% for field in form %} 10 |
11 |

12 | 内容 13 |

14 | {{ field }} 15 |
16 | {% endfor %} 17 |

18 | 标签 : 19 |

20 | 21 |
22 | {% endblock %} -------------------------------------------------------------------------------- /templates/post.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load django_markdown %} 3 | {% load disqus_tags %} 4 | 5 | {% block content %} 6 | 7 |
8 |
9 |
10 |

{{ post.title }}

11 | 15 |
16 |
17 |

18 | {{ post.content|markdown|markdown:'codehilite' }} 19 |

20 |
21 |
22 | {% block bottom %} 23 | {% endblock %} 24 | 25 |
26 | 46 | 47 |
48 | {% endblock %} -------------------------------------------------------------------------------- /templates/post_modify.html: -------------------------------------------------------------------------------- 1 | {% extends "post.html" %} 2 | {% block bottom %} 3 | {% if user.is_authenticated %} 4 | 12 | {% endif %} 13 | {% endblock %} -------------------------------------------------------------------------------- /templates/post_success.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block content %} 3 |

4 | {{content}} 5 |

6 | {% endblock %} -------------------------------------------------------------------------------- /templates/registration/login.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block content %} 4 | 5 |
6 | {% csrf_token %} 7 | 8 |
9 | 10 |
11 | 12 |
13 | 14 | {% endblock %} -------------------------------------------------------------------------------- /templates/tag.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% load django_markdown %} 4 | {% block content %} 5 |
6 | {% for post in post_list %} 7 |
8 |
9 |

{{ post.title }}

10 | 11 | 14 |
15 | 16 |
17 |

18 | {{ post.content|markdown }} 19 |

20 |
21 | Read More >>> 22 |
23 | {% endfor %} 24 |
25 | {% endblock %} --------------------------------------------------------------------------------