diff --git a/DjangoBlog/__init__.py b/DjangoBlog/__init__.py index e69de29..c45523b 100644 --- a/DjangoBlog/__init__.py +++ b/DjangoBlog/__init__.py @@ -0,0 +1,2 @@ +import pymysql +pymysql.install_as_MySQLdb() \ No newline at end of file diff --git a/DjangoBlog/settings.py b/DjangoBlog/settings.py index d5777e6..646c5c8 100644 --- a/DjangoBlog/settings.py +++ b/DjangoBlog/settings.py @@ -37,6 +37,7 @@ INSTALLED_APPS = [ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'blog' ] MIDDLEWARE = [ @@ -76,8 +77,12 @@ WSGI_APPLICATION = 'DjangoBlog.wsgi.application' DATABASES = { 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + 'ENGINE': 'django.db.backends.mysql', + 'NAME': 'djangoblog', + 'USER': 'root', + 'PASSWORD': 'root', + 'HOST': '192.168.21.130', + 'PORT': 3306, } } @@ -104,9 +109,9 @@ AUTH_PASSWORD_VALIDATORS = [ # Internationalization # https://docs.djangoproject.com/en/1.10/topics/i18n/ -LANGUAGE_CODE = 'en-us' +LANGUAGE_CODE = 'zh-hans' -TIME_ZONE = 'UTC' +TIME_ZONE = 'Asia/Shanghai' USE_I18N = True diff --git a/blog/__init__.py b/blog/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/blog/admin.py b/blog/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/blog/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/blog/apps.py b/blog/apps.py new file mode 100644 index 0000000..7930587 --- /dev/null +++ b/blog/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class BlogConfig(AppConfig): + name = 'blog' diff --git a/blog/migrations/0001_initial.py b/blog/migrations/0001_initial.py new file mode 100644 index 0000000..d3cc219 --- /dev/null +++ b/blog/migrations/0001_initial.py @@ -0,0 +1,77 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.2 on 2016-11-01 15:09 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Article', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=200, verbose_name='标题')), + ('body', models.TextField(verbose_name='正文')), + ('created_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('last_mod_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), + ('pub_time', models.DateTimeField(blank=True, help_text='不指定发布时间则视为草稿,可以指定未来时间,到时将自动发布。', null=True, verbose_name='发布时间')), + ('status', models.CharField(choices=[('d', '草稿'), ('p', '发表')], max_length=1, verbose_name='文章状态')), + ('summary', models.CharField(blank=True, help_text='可选,若为空将摘取正文的前54个字符。', max_length=200, verbose_name='摘要')), + ('views', models.PositiveIntegerField(default=0, verbose_name='浏览量')), + ('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='作者')), + ], + options={ + 'ordering': ['-pub_time'], + 'verbose_name': '文章', + 'verbose_name_plural': '文章', + }, + ), + migrations.CreateModel( + name='Category', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=30, verbose_name='分类名')), + ('created_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('last_mod_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), + ], + options={ + 'ordering': ['name'], + 'verbose_name': '分类', + 'verbose_name_plural': '分类', + }, + ), + migrations.CreateModel( + name='Tag', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=30, verbose_name='标签名')), + ('created_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('last_mod_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), + ], + options={ + 'ordering': ['name'], + 'verbose_name': '标签', + 'verbose_name_plural': '标签', + }, + ), + migrations.AddField( + model_name='article', + name='category', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='blog.Category', verbose_name='分类'), + ), + migrations.AddField( + model_name='article', + name='tags', + field=models.ManyToManyField(blank=True, to='blog.Tag', verbose_name='标签集合'), + ), + ] diff --git a/blog/migrations/__init__.py b/blog/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/blog/models.py b/blog/models.py new file mode 100644 index 0000000..62ff9af --- /dev/null +++ b/blog/models.py @@ -0,0 +1,71 @@ +from django.db import models +from django.core.urlresolvers import reverse +from django.conf import settings + + +class Article(models.Model): + STATUS_CHOICES = ( + ('d', '草稿'), + ('p', '发表'), + ) + + title = models.CharField('标题', max_length=200) + body = models.TextField('正文') + created_time = models.DateTimeField('创建时间', auto_now_add=True) + last_mod_time = models.DateTimeField('修改时间', auto_now=True) + pub_time = models.DateTimeField('发布时间', blank=True, null=True, + help_text="不指定发布时间则视为草稿,可以指定未来时间,到时将自动发布。") + status = models.CharField('文章状态', max_length=1, choices=STATUS_CHOICES) + summary = models.CharField('摘要', max_length=200, blank=True, help_text="可选,若为空将摘取正文的前54个字符。") + views = models.PositiveIntegerField('浏览量', default=0) + author = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name='作者', on_delete=models.CASCADE) + + category = models.ForeignKey('Category', verbose_name='分类', on_delete=models.CASCADE) + tags = models.ManyToManyField('Tag', verbose_name='标签集合', blank=True) + + def __str__(self): + return self.title + + class Meta: + ordering = ['-pub_time'] + verbose_name = "文章" + verbose_name_plural = verbose_name + + def get_absolute_url(self): + return reverse('blog:detail', kwargs={'article_id': self.pk}) + + def save(self, *args, **kwargs): + self.summary = self.summary or self.body[:120] + super().save(*args, **kwargs) + + def viewed(self): + self.views += 1 + self.save(update_fields=['views']) + + +class Category(models.Model): + name = models.CharField('分类名', max_length=30) + created_time = models.DateTimeField('创建时间', auto_now_add=True) + last_mod_time = models.DateTimeField('修改时间', auto_now=True) + + class Meta: + ordering = ['name'] + verbose_name = "分类" + verbose_name_plural = verbose_name + + def __str__(self): + return self.name + + +class Tag(models.Model): + name = models.CharField('标签名', max_length=30) + created_time = models.DateTimeField('创建时间', auto_now_add=True) + last_mod_time = models.DateTimeField('修改时间', auto_now=True) + + def __str__(self): + return self.name + + class Meta: + ordering = ['name'] + verbose_name = "标签" + verbose_name_plural = verbose_name diff --git a/blog/tests.py b/blog/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/blog/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/blog/views.py b/blog/views.py new file mode 100644 index 0000000..5ab9c27 --- /dev/null +++ b/blog/views.py @@ -0,0 +1,26 @@ +from django.shortcuts import render + +# Create your views here. +from django.views.generic.list import ListView +from blog.models import Article, Category, Tag +import markdown2 + + +class IndexView(ListView): + + # template_name属性用于指定使用哪个模板进行渲染 + template_name = 'blog/index.html' + + # context_object_name属性用于给上下文变量取名(在模板中使用该名字) + context_object_name = 'article_list' + + def get_queryset(self): + article_list = Article.objects.filter(status='p') + for article in article_list: + article.body = markdown2.markdown(article.body) + return article_list + + def get_context_data(self, **kwargs): + # 增加额外的数据,这里返回一个文章分类,以字典的形式 + kwargs['category_list'] = Category.objects.all().order_by('name') + return super(IndexView, self).get_context_data(**kwargs) diff --git a/db.sqlite3 b/db.sqlite3 deleted file mode 100644 index 8cd65ed..0000000 Binary files a/db.sqlite3 and /dev/null differ