From 89f4df30c958072251b5e48e70a676d5b3280fb8 Mon Sep 17 00:00:00 2001 From: the5fire Date: Sat, 10 Mar 2018 11:22:52 +0800 Subject: [PATCH 01/97] =?UTF-8?q?=E9=87=8D=E6=96=B0=E6=A2=B3=E7=90=86?= =?UTF-8?q?=E4=B9=A6=E7=A8=BF=E5=85=B3=E8=81=94=E5=88=86=E6=94=AF=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 3 - LICENSE | 21 ---- README.md | 1 - requirements.txt | 1 - typeidea/blog/__init__.py | 0 typeidea/blog/admin.py | 64 ----------- typeidea/blog/adminforms.py | 7 -- typeidea/blog/apps.py | 8 -- typeidea/blog/migrations/0001_initial.py | 70 ------------ .../migrations/0002_auto_20171018_2309.py | 20 ---- typeidea/blog/migrations/__init__.py | 0 typeidea/blog/models.py | 81 -------------- typeidea/blog/tests.py | 45 -------- typeidea/blog/views.py | 76 ------------- typeidea/comment/__init__.py | 0 typeidea/comment/admin.py | 12 -- typeidea/comment/apps.py | 8 -- typeidea/comment/migrations/0001_initial.py | 34 ------ .../comment/migrations/0002_comment_status.py | 20 ---- typeidea/comment/migrations/__init__.py | 0 typeidea/comment/models.py | 23 ---- typeidea/comment/tests.py | 6 - typeidea/comment/views.py | 6 - typeidea/config/__init__.py | 0 typeidea/config/admin.py | 18 --- typeidea/config/apps.py | 8 -- typeidea/config/migrations/0001_initial.py | 50 --------- .../config/migrations/0002_sidebar_status.py | 20 ---- typeidea/config/migrations/__init__.py | 0 typeidea/config/models.py | 49 --------- typeidea/config/tests.py | 6 - typeidea/config/views.py | 6 - typeidea/manage.py | 23 ---- typeidea/typeidea/__init__.py | 0 typeidea/typeidea/custom_admin.py | 20 ---- typeidea/typeidea/custom_site.py | 12 -- typeidea/typeidea/settings/__init__.py | 0 typeidea/typeidea/settings/base.py | 104 ------------------ typeidea/typeidea/settings/develop.py | 15 --- typeidea/typeidea/templates/blog/base.html | 44 -------- typeidea/typeidea/templates/blog/detail.html | 13 --- typeidea/typeidea/templates/blog/list.html | 21 ---- typeidea/typeidea/urls.py | 20 ---- typeidea/typeidea/wsgi.py | 16 --- 44 files changed, 951 deletions(-) delete mode 100644 CHANGELOG.md delete mode 100644 LICENSE delete mode 100644 README.md delete mode 100644 requirements.txt delete mode 100644 typeidea/blog/__init__.py delete mode 100644 typeidea/blog/admin.py delete mode 100644 typeidea/blog/adminforms.py delete mode 100644 typeidea/blog/apps.py delete mode 100644 typeidea/blog/migrations/0001_initial.py delete mode 100644 typeidea/blog/migrations/0002_auto_20171018_2309.py delete mode 100644 typeidea/blog/migrations/__init__.py delete mode 100644 typeidea/blog/models.py delete mode 100644 typeidea/blog/tests.py delete mode 100644 typeidea/blog/views.py delete mode 100644 typeidea/comment/__init__.py delete mode 100644 typeidea/comment/admin.py delete mode 100644 typeidea/comment/apps.py delete mode 100644 typeidea/comment/migrations/0001_initial.py delete mode 100644 typeidea/comment/migrations/0002_comment_status.py delete mode 100644 typeidea/comment/migrations/__init__.py delete mode 100644 typeidea/comment/models.py delete mode 100644 typeidea/comment/tests.py delete mode 100644 typeidea/comment/views.py delete mode 100644 typeidea/config/__init__.py delete mode 100644 typeidea/config/admin.py delete mode 100644 typeidea/config/apps.py delete mode 100644 typeidea/config/migrations/0001_initial.py delete mode 100644 typeidea/config/migrations/0002_sidebar_status.py delete mode 100644 typeidea/config/migrations/__init__.py delete mode 100644 typeidea/config/models.py delete mode 100644 typeidea/config/tests.py delete mode 100644 typeidea/config/views.py delete mode 100755 typeidea/manage.py delete mode 100644 typeidea/typeidea/__init__.py delete mode 100644 typeidea/typeidea/custom_admin.py delete mode 100644 typeidea/typeidea/custom_site.py delete mode 100644 typeidea/typeidea/settings/__init__.py delete mode 100644 typeidea/typeidea/settings/base.py delete mode 100644 typeidea/typeidea/settings/develop.py delete mode 100644 typeidea/typeidea/templates/blog/base.html delete mode 100644 typeidea/typeidea/templates/blog/detail.html delete mode 100644 typeidea/typeidea/templates/blog/list.html delete mode 100644 typeidea/typeidea/urls.py delete mode 100644 typeidea/typeidea/wsgi.py diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 78392ca..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,3 +0,0 @@ -## version 0.1.0 -- 2017-07-30 - -init project diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 8864d4a..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2017 - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/README.md b/README.md deleted file mode 100644 index d4e10d4..0000000 --- a/README.md +++ /dev/null @@ -1 +0,0 @@ -Hello, This is TypeIdea -- Blog system based on Django. diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 20e25ec..0000000 --- a/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -Django==1.11.3 diff --git a/typeidea/blog/__init__.py b/typeidea/blog/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/typeidea/blog/admin.py b/typeidea/blog/admin.py deleted file mode 100644 index b7f1025..0000000 --- a/typeidea/blog/admin.py +++ /dev/null @@ -1,64 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.contrib import admin -from django.urls import reverse -from django.utils.html import format_html - -from .adminforms import PostAdminForm -from .models import Post, Category, Tag -from typeidea.custom_site import custom_site -from typeidea.custom_admin import BaseOwnerAdmin - - -@admin.register(Post, site=custom_site) -class PostAdmin(BaseOwnerAdmin): - form = PostAdminForm - - list_display = [ - 'title', 'category', 'status_show', - 'created_time', 'operator' - ] - list_display_links = [] - - list_filter = ['category', ] - search_fields = ['title', 'category__name'] - save_on_top = True - - actions_on_top = True - actions_on_bottom = True - - # 编辑页面 - save_on_top = True - - fields = ( - ('category', 'title'), - 'desc', - 'status', - 'content', - 'tags', - ) - - def operator(self, obj): - return format_html( - '编辑', - reverse('cus_admin:blog_post_change', args=(obj.id,)) - ) - operator.short_description = '操作' - - -@admin.register(Category, site=custom_site) -class CategoryAdmin(BaseOwnerAdmin): - list_display = ('name', 'status', 'is_nav', 'created_time') - fields = ( - 'name', 'status', - 'is_nav', - ) - - -@admin.register(Tag, site=custom_site) -class TagAdmin(BaseOwnerAdmin): - list_display = ('name', 'status', 'created_time') - fields = ( - 'name', 'status' - ) diff --git a/typeidea/blog/adminforms.py b/typeidea/blog/adminforms.py deleted file mode 100644 index 2c49c1c..0000000 --- a/typeidea/blog/adminforms.py +++ /dev/null @@ -1,7 +0,0 @@ -# coding:utf-8 - -from django import forms - - -class PostAdminForm(forms.ModelForm): - desc = forms.CharField(widget=forms.Textarea, label='摘要', required=False) diff --git a/typeidea/blog/apps.py b/typeidea/blog/apps.py deleted file mode 100644 index 3dc2cc2..0000000 --- a/typeidea/blog/apps.py +++ /dev/null @@ -1,8 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.apps import AppConfig - - -class BlogConfig(AppConfig): - name = 'blog' diff --git a/typeidea/blog/migrations/0001_initial.py b/typeidea/blog/migrations/0001_initial.py deleted file mode 100644 index 0b1c052..0000000 --- a/typeidea/blog/migrations/0001_initial.py +++ /dev/null @@ -1,70 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.3 on 2017-08-12 16:41 -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='Category', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=50, verbose_name='\u540d\u79f0')), - ('status', models.PositiveIntegerField(choices=[(1, '\u53ef\u7528'), (2, '\u5220\u9664')], default=1, verbose_name='\u72b6\u6001')), - ('is_nav', models.BooleanField(default=False, verbose_name='\u662f\u5426\u4e3a\u5bfc\u822a')), - ('created_time', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')), - ('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='\u4f5c\u8005')), - ], - options={ - 'verbose_name': '\u5206\u7c7b', - 'verbose_name_plural': '\u5206\u7c7b', - }, - ), - migrations.CreateModel( - name='Post', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=50, verbose_name='\u6807\u9898')), - ('desc', models.CharField(blank=True, max_length=255, verbose_name='\u6458\u8981')), - ('content', models.TextField(help_text='\u6ce8\uff1a\u76ee\u524d\u4ec5\u652f\u6301Markdown\u683c\u5f0f\u6570\u636e', verbose_name='\u5185\u5bb9')), - ('status', models.IntegerField(choices=[(1, '\u4e0a\u7ebf'), (2, '\u8349\u7a3f'), (3, '\u5220\u9664')], default=1, verbose_name='\u72b6\u6001')), - ('created_time', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')), - ('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='blog.Category', verbose_name='\u5206\u7c7b')), - ('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='\u4f5c\u8005')), - ], - options={ - 'verbose_name': '\u6587\u7ae0', - 'verbose_name_plural': '\u6587\u7ae0', - }, - ), - migrations.CreateModel( - name='Tag', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=10, verbose_name='\u540d\u79f0')), - ('status', models.PositiveIntegerField(choices=[(1, '\u6b63\u5e38'), (2, '\u5220\u9664')], default=1, verbose_name='\u72b6\u6001')), - ('created_time', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')), - ('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='\u4f5c\u8005')), - ], - options={ - 'verbose_name': '\u6807\u7b7e', - 'verbose_name_plural': '\u6807\u7b7e', - }, - ), - migrations.AddField( - model_name='post', - name='tags', - field=models.ManyToManyField(to='blog.Tag', verbose_name='\u6807\u7b7e'), - ), - ] diff --git a/typeidea/blog/migrations/0002_auto_20171018_2309.py b/typeidea/blog/migrations/0002_auto_20171018_2309.py deleted file mode 100644 index 7e5b60a..0000000 --- a/typeidea/blog/migrations/0002_auto_20171018_2309.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.3 on 2017-10-18 15:09 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('blog', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='post', - name='tags', - field=models.ManyToManyField(related_name='posts', to='blog.Tag', verbose_name='\u6807\u7b7e'), - ), - ] diff --git a/typeidea/blog/migrations/__init__.py b/typeidea/blog/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/typeidea/blog/models.py b/typeidea/blog/models.py deleted file mode 100644 index 7beac14..0000000 --- a/typeidea/blog/models.py +++ /dev/null @@ -1,81 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.contrib.auth.models import User -from django.db import models - - -class Post(models.Model): - STATUS_ITEMS = ( - (1, '上线'), - (2, '草稿'), - (3, '删除'), - ) - title = models.CharField(max_length=50, verbose_name="标题") - desc = models.CharField(max_length=255, blank=True, verbose_name="摘要") - category = models.ForeignKey('Category', verbose_name="分类") - tags = models.ManyToManyField('Tag', related_name="posts", verbose_name="标签") - - content = models.TextField(verbose_name="内容", help_text="注:目前仅支持Markdown格式数据") - status = models.IntegerField(default=1, choices=STATUS_ITEMS, verbose_name="状态") - owner = models.ForeignKey(User, verbose_name="作者") - - created_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") - - def status_show(self): - return '当前状态:%s' % self.status - status_show.short_description = '展示状态' - - def __unicode__(self): - return self.title - - class Meta: - verbose_name = verbose_name_plural = "文章" - - -class TestManager(models.Manager): - def get_queryset(self): - return super(TestManager, self).get_queryset().filter(status=1) - - -class Category(models.Model): - objects = TestManager() - - STATUS_ITEMS = ( - (1, '可用'), - (2, '删除'), - ) - name = models.CharField(max_length=50, verbose_name="名称") - status = models.PositiveIntegerField(default=1, choices=STATUS_ITEMS, verbose_name="状态") - is_nav = models.BooleanField(default=False, verbose_name="是否为导航") - - owner = models.ForeignKey(User, verbose_name="作者") - created_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") - - def __unicode__(self): - return self.name - - class Meta: - verbose_name = verbose_name_plural = '分类' - - -class Tag(models.Model): - STATUS_ITEMS = ( - (1, '正常'), - (2, '删除'), - ) - - name = models.CharField(max_length=10, verbose_name="名称") - status = models.PositiveIntegerField(default=1, choices=STATUS_ITEMS, verbose_name="状态") - - owner = models.ForeignKey(User, verbose_name="作者") - created_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") - - def __str__(self): - return self.name - - def __unicode__(self): - return self.name - - class Meta: - verbose_name = verbose_name_plural = '标签' diff --git a/typeidea/blog/tests.py b/typeidea/blog/tests.py deleted file mode 100644 index a0770d3..0000000 --- a/typeidea/blog/tests.py +++ /dev/null @@ -1,45 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from pprint import pprint as pp - -from django.contrib.auth.models import User -from django.db import connection -from django.db.models import F, Q, Count, Sum -from django.test import TestCase -from django.test.utils import override_settings - -from .models import Category, Post - - -class TestCategory(TestCase): - @override_settings(DEBUG=True) - def setUp(self): - self.user = user = User.objects.create_user('the5fire', 'fake@email.com', 'password') - Category.objects.bulk_create([ - Category(name='cate_bulk_%s' % i, owner=user) - for i in range(10) - ]) - - @override_settings(DEBUG=True) - def test_filter(self): - categories = Category.objects.filter( - (Q(id=1) & Q(id=2)) - ) - - category = Category.objects.filter(id=1).update(status=F('status') + 1) - - user = User.objects.annotate(cate_sum=Sum('category__status')).get(username="the5fire") - pp(connection.queries) - - def test_values(self): - categories = Category.objects.values('name').filter(status=1) - print(categories) - - categories = Category.objects.values_list('name') - print(categories) - - categories = Category.objects.values_list('name', flat=True) - print(categories) - for cate_name in categories: - print(cate_name) diff --git a/typeidea/blog/views.py b/typeidea/blog/views.py deleted file mode 100644 index ac3cce2..0000000 --- a/typeidea/blog/views.py +++ /dev/null @@ -1,76 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.views.generic import ListView, DetailView - -from .models import Post, Tag, Category -from config.models import SideBar -from comment.models import Comment - - -class CommonMixin(object): - def get_category_context(self): - categories = Category.objects.filter(status=1) # TODO: fix magic number - - nav_cates = [] - cates = [] - for cate in categories: - if cate.is_nav: - nav_cates.append(cate) - else: - cates.append(cate) - return { - 'nav_cates': nav_cates, - 'cates': cates, - } - - def get_context_data(self, **kwargs): - side_bars = SideBar.objects.filter(status=1) - recently_posts = Post.objects.filter(status=1)[:10] - # hot_posts = Post.objects.filte(status=1).order_by('views')[:10] - recently_comments = Comment.objects.filter(status=1)[:10] - kwargs.update({ - 'side_bars': side_bars, - 'recently_comments': recently_comments, - 'recently_posts': recently_posts, - }) - kwargs.update(self.get_category_context()) - return super(CommonMixin, self).get_context_data(**kwargs) - - -class BasePostsView(CommonMixin, ListView): - model = Post - template_name = 'blog/list.html' - context_object_name = 'posts' - paginate_by = 3 - allow_empty = True - - -class IndexView(BasePostsView): - pass - - -class CategoryView(BasePostsView): - def get_queryset(self): - qs = super(CategoryView, self).get_queryset() - cate_id = self.kwargs.get('category_id') - qs = qs.filter(category_id=cate_id) - return qs - - -class TagView(BasePostsView): - def get_queryset(self): - tag_id = self.kwargs('tag_id') - try: - tag = Tag.objects.get(id=tag_id) - except Tag.DoesNotExist: - return [] - - posts = tag.posts.all() - return posts - - -class PostView(CommonMixin, DetailView): - model = Post - template_name = 'blog/detail.html' - context_object_name = 'post' diff --git a/typeidea/comment/__init__.py b/typeidea/comment/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/typeidea/comment/admin.py b/typeidea/comment/admin.py deleted file mode 100644 index e03ff93..0000000 --- a/typeidea/comment/admin.py +++ /dev/null @@ -1,12 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.contrib import admin - -from .models import Comment -from typeidea.custom_site import custom_site - - -@admin.register(Comment, site=custom_site) -class CommentAdmin(admin.ModelAdmin): - list_display = ('post', 'nickname', 'content', 'website', 'created_time') diff --git a/typeidea/comment/apps.py b/typeidea/comment/apps.py deleted file mode 100644 index b02f65b..0000000 --- a/typeidea/comment/apps.py +++ /dev/null @@ -1,8 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.apps import AppConfig - - -class CommentConfig(AppConfig): - name = 'comment' diff --git a/typeidea/comment/migrations/0001_initial.py b/typeidea/comment/migrations/0001_initial.py deleted file mode 100644 index 120f361..0000000 --- a/typeidea/comment/migrations/0001_initial.py +++ /dev/null @@ -1,34 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.3 on 2017-08-12 16:41 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('blog', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='Comment', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('content', models.CharField(max_length=2000, verbose_name='\u5185\u5bb9')), - ('nickname', models.CharField(max_length=50, verbose_name='\u6635\u79f0')), - ('website', models.URLField(verbose_name='\u7f51\u7ad9')), - ('email', models.EmailField(max_length=254, verbose_name='\u90ae\u7bb1')), - ('created_time', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')), - ('post', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='blog.Post', verbose_name='\u6587\u7ae0')), - ], - options={ - 'verbose_name': '\u8bc4\u8bba', - 'verbose_name_plural': '\u8bc4\u8bba', - }, - ), - ] diff --git a/typeidea/comment/migrations/0002_comment_status.py b/typeidea/comment/migrations/0002_comment_status.py deleted file mode 100644 index c64f41b..0000000 --- a/typeidea/comment/migrations/0002_comment_status.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.3 on 2017-10-18 15:14 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('comment', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='comment', - name='status', - field=models.PositiveIntegerField(choices=[(1, '\u6b63\u5e38'), (2, '\u5220\u9664')], default=1, verbose_name='\u72b6\u6001'), - ), - ] diff --git a/typeidea/comment/migrations/__init__.py b/typeidea/comment/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/typeidea/comment/models.py b/typeidea/comment/models.py deleted file mode 100644 index 816b417..0000000 --- a/typeidea/comment/models.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import models - -from blog.models import Post - - -class Comment(models.Model): - STATUS_ITEMS = ( - (1, '正常'), - (2, '删除'), - ) - post = models.ForeignKey(Post, verbose_name="文章") - content = models.CharField(max_length=2000, verbose_name="内容") - nickname = models.CharField(max_length=50, verbose_name="昵称") - website = models.URLField(verbose_name="网站") - email = models.EmailField(verbose_name="邮箱") - status = models.PositiveIntegerField(default=1, choices=STATUS_ITEMS, verbose_name="状态") - created_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") - - class Meta: - verbose_name = verbose_name_plural = "评论" diff --git a/typeidea/comment/tests.py b/typeidea/comment/tests.py deleted file mode 100644 index 5982e6b..0000000 --- a/typeidea/comment/tests.py +++ /dev/null @@ -1,6 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.test import TestCase - -# Create your tests here. diff --git a/typeidea/comment/views.py b/typeidea/comment/views.py deleted file mode 100644 index e784a0b..0000000 --- a/typeidea/comment/views.py +++ /dev/null @@ -1,6 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.shortcuts import render - -# Create your views here. diff --git a/typeidea/config/__init__.py b/typeidea/config/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/typeidea/config/admin.py b/typeidea/config/admin.py deleted file mode 100644 index 53569b9..0000000 --- a/typeidea/config/admin.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.contrib import admin - -from .models import Link, SideBar -from typeidea.custom_site import custom_site -from typeidea.custom_admin import BaseOwnerAdmin - - -@admin.register(Link, site=custom_site) -class LinkAdmin(BaseOwnerAdmin): - list_display = ('title', 'href', 'status', 'weight', 'created_time') - - -@admin.register(SideBar, site=custom_site) -class SideBarAdmin(BaseOwnerAdmin): - list_display = ('title', 'display_type', 'content', 'created_time') diff --git a/typeidea/config/apps.py b/typeidea/config/apps.py deleted file mode 100644 index 6d779f7..0000000 --- a/typeidea/config/apps.py +++ /dev/null @@ -1,8 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.apps import AppConfig - - -class ConfigConfig(AppConfig): - name = 'config' diff --git a/typeidea/config/migrations/0001_initial.py b/typeidea/config/migrations/0001_initial.py deleted file mode 100644 index 88e12cc..0000000 --- a/typeidea/config/migrations/0001_initial.py +++ /dev/null @@ -1,50 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.3 on 2017-08-12 16:41 -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='Link', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=50, verbose_name='\u6807\u9898')), - ('href', models.URLField(verbose_name='\u94fe\u63a5')), - ('status', models.PositiveIntegerField(choices=[(1, '\u6b63\u5e38'), (2, '\u5220\u9664')], default=1, verbose_name='\u72b6\u6001')), - ('weight', models.PositiveIntegerField(choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)], default=1, help_text='\u6743\u91cd\u8d8a\u9ad8\u5c55\u793a\u987a\u5e8f\u7ea6\u9760\u524d', verbose_name='\u6743\u91cd')), - ('created_time', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')), - ('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='\u4f5c\u8005')), - ], - options={ - 'verbose_name': '\u53cb\u94fe', - 'verbose_name_plural': '\u53cb\u94fe', - }, - ), - migrations.CreateModel( - name='SideBar', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=50, verbose_name='\u6807\u9898')), - ('display_type', models.PositiveIntegerField(choices=[(1, 'HTML'), (2, '\u6700\u65b0\u6587\u7ae0'), (3, '\u6700\u70ed\u6587\u7ae0'), (4, '\u6700\u8fd1\u8bc4\u8bba')], default=1, verbose_name='\u5c55\u793a\u7c7b\u578b')), - ('content', models.CharField(blank=True, help_text='\u5982\u679c\u8bbe\u7f6e\u7684\u4e0d\u662fHTML\u7c7b\u578b\uff0c\u53ef\u4e3a\u7a7a', max_length=500, verbose_name='\u5185\u5bb9')), - ('created_time', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')), - ('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='\u4f5c\u8005')), - ], - options={ - 'verbose_name': '\u4fa7\u8fb9\u680f', - 'verbose_name_plural': '\u4fa7\u8fb9\u680f', - }, - ), - ] diff --git a/typeidea/config/migrations/0002_sidebar_status.py b/typeidea/config/migrations/0002_sidebar_status.py deleted file mode 100644 index 3063795..0000000 --- a/typeidea/config/migrations/0002_sidebar_status.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.3 on 2017-10-18 15:09 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('config', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='sidebar', - name='status', - field=models.PositiveIntegerField(choices=[(1, '\u5c55\u793a'), (2, '\u4e0b\u7ebf')], default=1, verbose_name='\u72b6\u6001'), - ), - ] diff --git a/typeidea/config/migrations/__init__.py b/typeidea/config/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/typeidea/config/models.py b/typeidea/config/models.py deleted file mode 100644 index c6e8caf..0000000 --- a/typeidea/config/models.py +++ /dev/null @@ -1,49 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.contrib.auth.models import User -from django.db import models - - -class Link(models.Model): - STATUS_ITEMS = ( - (1, '正常'), - (2, '删除'), - ) - title = models.CharField(max_length=50, verbose_name="标题") - href = models.URLField(verbose_name="链接") # 默认长度200 - status = models.PositiveIntegerField(default=1, choices=STATUS_ITEMS, verbose_name="状态") - weight = models.PositiveIntegerField(default=1, choices=zip(range(1, 6), range(1, 6)), - verbose_name="权重", - help_text="权重越高展示顺序约靠前") - - owner = models.ForeignKey(User, verbose_name="作者") - created_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") - - class Meta: - verbose_name = verbose_name_plural = "友链" - - -class SideBar(models.Model): - STATUS_ITEMS = ( - (1, '展示'), - (2, '下线'), - ) - SIDE_TYPE = ( - (1, 'HTML'), - (2, '最新文章'), - (3, '最热文章'), - (4, '最近评论'), - ) - title = models.CharField(max_length=50, verbose_name="标题") - display_type = models.PositiveIntegerField(default=1, choices=SIDE_TYPE, - verbose_name="展示类型") - status = models.PositiveIntegerField(default=1, choices=STATUS_ITEMS, verbose_name="状态") - content = models.CharField(max_length=500, blank=True, verbose_name="内容", - help_text="如果设置的不是HTML类型,可为空") - - owner = models.ForeignKey(User, verbose_name="作者") - created_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") - - class Meta: - verbose_name = verbose_name_plural = "侧边栏" diff --git a/typeidea/config/tests.py b/typeidea/config/tests.py deleted file mode 100644 index 5982e6b..0000000 --- a/typeidea/config/tests.py +++ /dev/null @@ -1,6 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.test import TestCase - -# Create your tests here. diff --git a/typeidea/config/views.py b/typeidea/config/views.py deleted file mode 100644 index e784a0b..0000000 --- a/typeidea/config/views.py +++ /dev/null @@ -1,6 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.shortcuts import render - -# Create your views here. diff --git a/typeidea/manage.py b/typeidea/manage.py deleted file mode 100755 index be33a7c..0000000 --- a/typeidea/manage.py +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/env python -import os -import sys - -if __name__ == "__main__": - profile = os.environ.get('TYPEIDEA_PROFILE', 'develop') - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "typeidea.settings.%s" % profile) - try: - from django.core.management import execute_from_command_line - except ImportError: - # The above import may fail for some other reason. Ensure that the - # issue is really that Django is missing to avoid masking other - # exceptions on Python 2. - try: - import django - except ImportError: - raise ImportError( - "Couldn't import Django. Are you sure it's installed and " - "available on your PYTHONPATH environment variable? Did you " - "forget to activate a virtual environment?" - ) - raise - execute_from_command_line(sys.argv) diff --git a/typeidea/typeidea/__init__.py b/typeidea/typeidea/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/typeidea/typeidea/custom_admin.py b/typeidea/typeidea/custom_admin.py deleted file mode 100644 index 87b1d37..0000000 --- a/typeidea/typeidea/custom_admin.py +++ /dev/null @@ -1,20 +0,0 @@ -# coding:utf-8 -from __future__ import unicode_literals - -from django.contrib import admin - - -class BaseOwnerAdmin(admin.ModelAdmin): - """ 针对有owner属性的数据, 重写 - 1. save_model - 保证每条数据都属于当前用户 - 2. 重写get_queryset - 保证每个用户只能看到自己的文章 - """ - def get_queryset(self, request): - qs = super(BaseOwnerAdmin, self).get_queryset(request) - if request.user.is_superuser: - return qs - return qs.filter(owner=request.user) - - def save_model(self, request, obj, form, change): - obj.owner = request.user - return super(BaseOwnerAdmin, self).save_model(request, obj, form, change) diff --git a/typeidea/typeidea/custom_site.py b/typeidea/typeidea/custom_site.py deleted file mode 100644 index 46f8f26..0000000 --- a/typeidea/typeidea/custom_site.py +++ /dev/null @@ -1,12 +0,0 @@ -# coding:utf-8 - -from django.contrib.admin import AdminSite - - -class CustomSite(AdminSite): - site_header = 'Typeidea' - site_title = 'Typeidea管理后台' - index_title = '首页' - - -custom_site = CustomSite(name='cus_admin') diff --git a/typeidea/typeidea/settings/__init__.py b/typeidea/typeidea/settings/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/typeidea/typeidea/settings/base.py b/typeidea/typeidea/settings/base.py deleted file mode 100644 index 00825fc..0000000 --- a/typeidea/typeidea/settings/base.py +++ /dev/null @@ -1,104 +0,0 @@ -# coding:utf-8 -import os - -# Build paths inside the project like this: os.path.join(BASE_DIR, ...) -BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = '=vp!a@vfobl(-d&z*=3x1+r3g&+(7!8xtqv_+1r%2mvr!#4pw)' - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = True - -ALLOWED_HOSTS = [] - - -# Application definition - -INSTALLED_APPS = [ - 'blog', - 'config', - 'comment', - 'typeidea', - - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', -] - -MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'typeidea.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.debug', - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'typeidea.wsgi.application' - - - -# Password validation -# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/1.11/topics/i18n/ - -LANGUAGE_CODE = 'zh-hans' - -TIME_ZONE = 'Asia/Shanghai' - -USE_I18N = True - -USE_L10N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/1.11/howto/static-files/ - -STATIC_URL = '/static/' diff --git a/typeidea/typeidea/settings/develop.py b/typeidea/typeidea/settings/develop.py deleted file mode 100644 index 3b6d287..0000000 --- a/typeidea/typeidea/settings/develop.py +++ /dev/null @@ -1,15 +0,0 @@ -# coding:utf-8 - -from .base import * # NOQA - -DEBUG = True - -# Database -# https://docs.djangoproject.com/en/1.11/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), - }, -} diff --git a/typeidea/typeidea/templates/blog/base.html b/typeidea/typeidea/templates/blog/base.html deleted file mode 100644 index 4a56e28..0000000 --- a/typeidea/typeidea/templates/blog/base.html +++ /dev/null @@ -1,44 +0,0 @@ -

typeidea blog - by the5fire

- - -
-{% block content %} -{% endblock %} -
- -
- - - -
- - diff --git a/typeidea/typeidea/templates/blog/detail.html b/typeidea/typeidea/templates/blog/detail.html deleted file mode 100644 index 45d9b08..0000000 --- a/typeidea/typeidea/templates/blog/detail.html +++ /dev/null @@ -1,13 +0,0 @@ -{% extends "./base.html" %} - -{% block content %} -

{{ post.title }}

-
- -
-{{ post.content }} -{% endblock %} diff --git a/typeidea/typeidea/templates/blog/list.html b/typeidea/typeidea/templates/blog/list.html deleted file mode 100644 index fc6ad35..0000000 --- a/typeidea/typeidea/templates/blog/list.html +++ /dev/null @@ -1,21 +0,0 @@ -{% extends "./base.html" %} - -{% block content %} - -{% endblock %} diff --git a/typeidea/typeidea/urls.py b/typeidea/typeidea/urls.py deleted file mode 100644 index 5697afc..0000000 --- a/typeidea/typeidea/urls.py +++ /dev/null @@ -1,20 +0,0 @@ -# coding:utf-8 -from __future__ import unicode_literals - -from django.conf.urls import url -from django.contrib import admin - -from .custom_site import custom_site -from blog.views import IndexView, CategoryView, TagView, PostView -# from config.views import links - - -urlpatterns = [ - url(r'^$', IndexView.as_view(), name="index"), - url(r'^category/(?P\d+)/', CategoryView.as_view(), name="category"), - url(r'^tag/(?P\d+)/$', TagView.as_view(), name="tag"), - url(r'^post/(?P\d+)/$', PostView.as_view(), name="detail"), - # url(r'^links/$', links), - url(r'^admin/', admin.site.urls), - url(r'^cus_admin/', custom_site.urls), -] diff --git a/typeidea/typeidea/wsgi.py b/typeidea/typeidea/wsgi.py deleted file mode 100644 index 23506be..0000000 --- a/typeidea/typeidea/wsgi.py +++ /dev/null @@ -1,16 +0,0 @@ -""" -WSGI config for typeidea project. - -It exposes the WSGI callable as a module-level variable named ``application``. - -For more information on this file, see -https://docs.djangoproject.com/en/1.11/howto/deployment/wsgi/ -""" - -import os - -from django.core.wsgi import get_wsgi_application - -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "typeidea.settings") - -application = get_wsgi_application() From 8f263dc981f7eedfd70592479f0dbebb97b7bc5e Mon Sep 17 00:00:00 2001 From: the5fire Date: Sat, 10 Mar 2018 11:29:17 +0800 Subject: [PATCH 02/97] init project --- CHANGELOG.md | 0 LICENSE | 0 README.md | 0 requirements.txt | 0 typeidea/manage.py | 22 +++++ typeidea/typeidea/__init__.py | 0 typeidea/typeidea/settings/__init__.py | 0 typeidea/typeidea/settings/base.py | 120 +++++++++++++++++++++++++ typeidea/typeidea/settings/develop.py | 13 +++ typeidea/typeidea/urls.py | 21 +++++ typeidea/typeidea/wsgi.py | 16 ++++ 11 files changed, 192 insertions(+) create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 requirements.txt create mode 100755 typeidea/manage.py create mode 100644 typeidea/typeidea/__init__.py create mode 100644 typeidea/typeidea/settings/__init__.py create mode 100644 typeidea/typeidea/settings/base.py create mode 100644 typeidea/typeidea/settings/develop.py create mode 100644 typeidea/typeidea/urls.py create mode 100644 typeidea/typeidea/wsgi.py diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..e69de29 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e69de29 diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..e69de29 diff --git a/typeidea/manage.py b/typeidea/manage.py new file mode 100755 index 0000000..d08fc9a --- /dev/null +++ b/typeidea/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +import os +import sys + +if __name__ == "__main__": + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "typeidea.settings") + try: + from django.core.management import execute_from_command_line + except ImportError: + # The above import may fail for some other reason. Ensure that the + # issue is really that Django is missing to avoid masking other + # exceptions on Python 2. + try: + import django + except ImportError: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) + raise + execute_from_command_line(sys.argv) diff --git a/typeidea/typeidea/__init__.py b/typeidea/typeidea/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/typeidea/typeidea/settings/__init__.py b/typeidea/typeidea/settings/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/typeidea/typeidea/settings/base.py b/typeidea/typeidea/settings/base.py new file mode 100644 index 0000000..0dcbb87 --- /dev/null +++ b/typeidea/typeidea/settings/base.py @@ -0,0 +1,120 @@ +""" +Django settings for typeidea project. + +Generated by 'django-admin startproject' using Django 1.11.8. + +For more information on this file, see +https://docs.djangoproject.com/en/1.11/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/1.11/ref/settings/ +""" + +import os + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'mspj07-bob3&2(*6h+)30iat$mnnd6g05m4ap&-eu0d!774c%%' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'typeidea.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'typeidea.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/1.11/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + } +} + + +# Password validation +# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/1.11/topics/i18n/ + +LANGUAGE_CODE = 'zh-hans' + +TIME_ZONE = 'Asia/Shanghai' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/1.11/howto/static-files/ + +STATIC_URL = '/static/' diff --git a/typeidea/typeidea/settings/develop.py b/typeidea/typeidea/settings/develop.py new file mode 100644 index 0000000..86974fc --- /dev/null +++ b/typeidea/typeidea/settings/develop.py @@ -0,0 +1,13 @@ +# coding:utf-8 + +from .base import * # NOQA + + +DEBUG = True + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + } +} diff --git a/typeidea/typeidea/urls.py b/typeidea/typeidea/urls.py new file mode 100644 index 0000000..f50f624 --- /dev/null +++ b/typeidea/typeidea/urls.py @@ -0,0 +1,21 @@ +"""typeidea URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/1.11/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.conf.urls import url, include + 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) +""" +from django.conf.urls import url +from django.contrib import admin + +urlpatterns = [ + url(r'^admin/', admin.site.urls), +] diff --git a/typeidea/typeidea/wsgi.py b/typeidea/typeidea/wsgi.py new file mode 100644 index 0000000..23506be --- /dev/null +++ b/typeidea/typeidea/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for typeidea project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/1.11/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "typeidea.settings") + +application = get_wsgi_application() From 25a8a62bd4286416b7f8f8d01970820f709f2ac2 Mon Sep 17 00:00:00 2001 From: the5fire Date: Sat, 10 Mar 2018 11:44:21 +0800 Subject: [PATCH 03/97] =?UTF-8?q?=E5=AE=8C=E6=88=90App=E5=92=8CModel?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=9A=84=E5=88=9B=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- typeidea/blog/__init__.py | 0 typeidea/blog/admin.py | 6 +++ typeidea/blog/apps.py | 8 ++++ typeidea/blog/migrations/__init__.py | 0 typeidea/blog/models.py | 63 +++++++++++++++++++++++++ typeidea/blog/tests.py | 6 +++ typeidea/blog/views.py | 6 +++ typeidea/comment/__init__.py | 0 typeidea/comment/admin.py | 6 +++ typeidea/comment/apps.py | 8 ++++ typeidea/comment/migrations/__init__.py | 0 typeidea/comment/models.py | 25 ++++++++++ typeidea/comment/tests.py | 6 +++ typeidea/comment/views.py | 6 +++ typeidea/config/__init__.py | 0 typeidea/config/admin.py | 6 +++ typeidea/config/apps.py | 8 ++++ typeidea/config/migrations/__init__.py | 0 typeidea/config/models.py | 53 +++++++++++++++++++++ typeidea/config/tests.py | 6 +++ typeidea/config/views.py | 6 +++ typeidea/typeidea/settings/base.py | 4 ++ 22 files changed, 223 insertions(+) create mode 100644 typeidea/blog/__init__.py create mode 100644 typeidea/blog/admin.py create mode 100644 typeidea/blog/apps.py create mode 100644 typeidea/blog/migrations/__init__.py create mode 100644 typeidea/blog/models.py create mode 100644 typeidea/blog/tests.py create mode 100644 typeidea/blog/views.py create mode 100644 typeidea/comment/__init__.py create mode 100644 typeidea/comment/admin.py create mode 100644 typeidea/comment/apps.py create mode 100644 typeidea/comment/migrations/__init__.py create mode 100644 typeidea/comment/models.py create mode 100644 typeidea/comment/tests.py create mode 100644 typeidea/comment/views.py create mode 100644 typeidea/config/__init__.py create mode 100644 typeidea/config/admin.py create mode 100644 typeidea/config/apps.py create mode 100644 typeidea/config/migrations/__init__.py create mode 100644 typeidea/config/models.py create mode 100644 typeidea/config/tests.py create mode 100644 typeidea/config/views.py diff --git a/typeidea/blog/__init__.py b/typeidea/blog/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/typeidea/blog/admin.py b/typeidea/blog/admin.py new file mode 100644 index 0000000..13be29d --- /dev/null +++ b/typeidea/blog/admin.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.contrib import admin + +# Register your models here. diff --git a/typeidea/blog/apps.py b/typeidea/blog/apps.py new file mode 100644 index 0000000..3dc2cc2 --- /dev/null +++ b/typeidea/blog/apps.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.apps import AppConfig + + +class BlogConfig(AppConfig): + name = 'blog' diff --git a/typeidea/blog/migrations/__init__.py b/typeidea/blog/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/typeidea/blog/models.py b/typeidea/blog/models.py new file mode 100644 index 0000000..971093f --- /dev/null +++ b/typeidea/blog/models.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.contrib.auth.models import User +from django.db import models + + +class Category(models.Model): + STATUS_NORMAL = 1 + STATUS_DELETE = 0 + STATUS_ITEMS = ( + (STATUS_NORMAL, '正常'), + (STATUS_DELETE, '删除'), + ) + + name = models.CharField(max_length=50, verbose_name="名称") + status = models.PositiveIntegerField(default=STATUS_NORMAL, choices=STATUS_ITEMS, verbose_name="状态") + is_nav = models.BooleanField(default=False, verbose_name="是否为导航") + author = models.ForeignKey(User, verbose_name="作者") + created_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") + + class Meta: + verbose_name = verbose_name_plural = '分类' + + +class Tag(models.Model): + STATUS_NORMAL = 1 + STATUS_DELETE = 0 + STATUS_ITEMS = ( + (STATUS_NORMAL, '正常'), + (STATUS_DELETE, '删除'), + ) + + name = models.CharField(max_length=10, verbose_name="名称") + status = models.PositiveIntegerField(default=STATUS_NORMAL, choices=STATUS_ITEMS, verbose_name="状态") + owner = models.ForeignKey(User, verbose_name="作者") + created_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") + + class Meta: + verbose_name = verbose_name_plural = '标签' + + +class Post(models.Model): + STATUS_NORMAL = 1 + STATUS_DELETE = 0 + STATUS_DRAFT = 2 + STATUS_ITEMS = ( + (STATUS_NORMAL, '正常'), + (STATUS_DELETE, '删除'), + (STATUS_DRAFT, '草稿'), + ) + + title = models.CharField(max_length=255, verbose_name="标题") + desc = models.CharField(max_length=1024, blank=True, verbose_name="摘要") + content = models.TextField(verbose_name="正文", help_text="正文必须为MarkDown格式") + status = models.PositiveIntegerField(default=STATUS_NORMAL, choices=STATUS_ITEMS, verbose_name="状态") + category = models.ForeignKey(Category, verbose_name="分类") + tag = models.ManyToManyField(Tag, verbose_name="标签") + owner = models.ForeignKey(User, verbose_name="作者") + created_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") + + class Meta: + verbose_name = verbose_name_plural = "文章" diff --git a/typeidea/blog/tests.py b/typeidea/blog/tests.py new file mode 100644 index 0000000..5982e6b --- /dev/null +++ b/typeidea/blog/tests.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.test import TestCase + +# Create your tests here. diff --git a/typeidea/blog/views.py b/typeidea/blog/views.py new file mode 100644 index 0000000..e784a0b --- /dev/null +++ b/typeidea/blog/views.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.shortcuts import render + +# Create your views here. diff --git a/typeidea/comment/__init__.py b/typeidea/comment/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/typeidea/comment/admin.py b/typeidea/comment/admin.py new file mode 100644 index 0000000..13be29d --- /dev/null +++ b/typeidea/comment/admin.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.contrib import admin + +# Register your models here. diff --git a/typeidea/comment/apps.py b/typeidea/comment/apps.py new file mode 100644 index 0000000..b02f65b --- /dev/null +++ b/typeidea/comment/apps.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.apps import AppConfig + + +class CommentConfig(AppConfig): + name = 'comment' diff --git a/typeidea/comment/migrations/__init__.py b/typeidea/comment/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/typeidea/comment/models.py b/typeidea/comment/models.py new file mode 100644 index 0000000..407b8b9 --- /dev/null +++ b/typeidea/comment/models.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models + +from blog.models import Post + + +class Comment(models.Model): + STATUS_NORMAL = 1 + STATUS_DELETE = 0 + STATUS_ITEMS = ( + (STATUS_NORMAL, '正常'), + (STATUS_DELETE, '删除'), + ) + target = models.ForeignKey(Post, verbose_name="评论目标") + content = models.CharField(max_length=2000, verbose_name="内容") + nickname = models.CharField(max_length=50, verbose_name="昵称") + website = models.URLField(verbose_name="网站") + email = models.EmailField(verbose_name="邮箱") + status = models.PositiveIntegerField(default=STATUS_NORMAL, choices=STATUS_ITEMS, verbose_name="状态") + created_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") + + class Meta: + verbose_name = verbose_name_plural = "评论" diff --git a/typeidea/comment/tests.py b/typeidea/comment/tests.py new file mode 100644 index 0000000..5982e6b --- /dev/null +++ b/typeidea/comment/tests.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.test import TestCase + +# Create your tests here. diff --git a/typeidea/comment/views.py b/typeidea/comment/views.py new file mode 100644 index 0000000..e784a0b --- /dev/null +++ b/typeidea/comment/views.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.shortcuts import render + +# Create your views here. diff --git a/typeidea/config/__init__.py b/typeidea/config/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/typeidea/config/admin.py b/typeidea/config/admin.py new file mode 100644 index 0000000..13be29d --- /dev/null +++ b/typeidea/config/admin.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.contrib import admin + +# Register your models here. diff --git a/typeidea/config/apps.py b/typeidea/config/apps.py new file mode 100644 index 0000000..6d779f7 --- /dev/null +++ b/typeidea/config/apps.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.apps import AppConfig + + +class ConfigConfig(AppConfig): + name = 'config' diff --git a/typeidea/config/migrations/__init__.py b/typeidea/config/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/typeidea/config/models.py b/typeidea/config/models.py new file mode 100644 index 0000000..3ff5730 --- /dev/null +++ b/typeidea/config/models.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.contrib.auth.models import User +from django.db import models + + +class Link(models.Model): + STATUS_NORMAL = 1 + STATUS_DELETE = 0 + STATUS_ITEMS = ( + (STATUS_NORMAL, '正常'), + (STATUS_DELETE, '删除'), + ) + title = models.CharField(max_length=50, verbose_name="标题") + href = models.URLField(verbose_name="链接") # 默认长度200 + status = models.PositiveIntegerField(default=STATUS_NORMAL, choices=STATUS_ITEMS, verbose_name="状态") + weight = models.PositiveIntegerField(default=1, choices=zip(range(1, 6), range(1, 6)), + verbose_name="权重", + help_text="权重高展示顺序靠前") + + owner = models.ForeignKey(User, verbose_name="作者") + created_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") + + class Meta: + verbose_name = verbose_name_plural = "友链" + + +class SideBar(models.Model): + STATUS_SHOW = 1 + STATUS_HIDE = 0 + STATUS_ITEMS = ( + (STATUS_SHOW, '展示'), + (STATUS_HIDE, '隐藏'), + ) + SIDE_TYPE = ( + (1, 'HTML'), + (2, '最新文章'), + (3, '最热文章'), + (4, '最近评论'), + ) + title = models.CharField(max_length=50, verbose_name="标题") + display_type = models.PositiveIntegerField(default=1, choices=SIDE_TYPE, + verbose_name="展示类型") + content = models.CharField(max_length=500, blank=True, verbose_name="内容", + help_text="如果设置的不是HTML类型,可为空") + + status = models.PositiveIntegerField(default=STATUS_SHOW, choices=STATUS_ITEMS, verbose_name="状态") + owner = models.ForeignKey(User, verbose_name="作者") + created_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") + + class Meta: + verbose_name = verbose_name_plural = "侧边栏" diff --git a/typeidea/config/tests.py b/typeidea/config/tests.py new file mode 100644 index 0000000..5982e6b --- /dev/null +++ b/typeidea/config/tests.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.test import TestCase + +# Create your tests here. diff --git a/typeidea/config/views.py b/typeidea/config/views.py new file mode 100644 index 0000000..e784a0b --- /dev/null +++ b/typeidea/config/views.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.shortcuts import render + +# Create your views here. diff --git a/typeidea/typeidea/settings/base.py b/typeidea/typeidea/settings/base.py index 0dcbb87..122f5ef 100644 --- a/typeidea/typeidea/settings/base.py +++ b/typeidea/typeidea/settings/base.py @@ -31,6 +31,10 @@ # Application definition INSTALLED_APPS = [ + 'blog', + 'config', + 'comment', + 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', From 2a803ddeca6357f86b6c276a9aa97e0c2702707c Mon Sep 17 00:00:00 2001 From: the5fire Date: Sat, 10 Mar 2018 11:49:52 +0800 Subject: [PATCH 04/97] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=81=97=E6=BC=8F?= =?UTF-8?q?=E6=8B=86=E5=88=86settings=E7=9A=84=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- typeidea/manage.py | 4 +++- typeidea/typeidea/wsgi.py | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/typeidea/manage.py b/typeidea/manage.py index d08fc9a..35bcd25 100755 --- a/typeidea/manage.py +++ b/typeidea/manage.py @@ -3,7 +3,9 @@ import sys if __name__ == "__main__": - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "typeidea.settings") + profile = os.environ.get('TYPEIDEA_PROFILE', 'develop') + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "typeidea.settings.%s" % profile) + try: from django.core.management import execute_from_command_line except ImportError: diff --git a/typeidea/typeidea/wsgi.py b/typeidea/typeidea/wsgi.py index 23506be..9a10880 100644 --- a/typeidea/typeidea/wsgi.py +++ b/typeidea/typeidea/wsgi.py @@ -11,6 +11,7 @@ from django.core.wsgi import get_wsgi_application -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "typeidea.settings") +profile = os.environ.get('TYPEIDEA_PROFILE', 'develop') +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "typeidea.settings.%s" % profile) application = get_wsgi_application() From 2ecc6273f0a9fc22322a502d0dc4cccb3720becb Mon Sep 17 00:00:00 2001 From: the5fire Date: Sat, 10 Mar 2018 12:35:54 +0800 Subject: [PATCH 05/97] =?UTF-8?q?=E6=8F=90=E4=BA=A4migrations?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- typeidea/blog/migrations/0001_initial.py | 70 +++++++++++++++++++++ typeidea/comment/migrations/0001_initial.py | 35 +++++++++++ typeidea/config/migrations/0001_initial.py | 51 +++++++++++++++ 3 files changed, 156 insertions(+) create mode 100644 typeidea/blog/migrations/0001_initial.py create mode 100644 typeidea/comment/migrations/0001_initial.py create mode 100644 typeidea/config/migrations/0001_initial.py diff --git a/typeidea/blog/migrations/0001_initial.py b/typeidea/blog/migrations/0001_initial.py new file mode 100644 index 0000000..741b994 --- /dev/null +++ b/typeidea/blog/migrations/0001_initial.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.8 on 2018-03-10 03:49 +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='Category', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=50, verbose_name='\u540d\u79f0')), + ('status', models.PositiveIntegerField(choices=[(1, '\u6b63\u5e38'), (0, '\u5220\u9664')], default=1, verbose_name='\u72b6\u6001')), + ('is_nav', models.BooleanField(default=False, verbose_name='\u662f\u5426\u4e3a\u5bfc\u822a')), + ('created_time', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')), + ('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='\u4f5c\u8005')), + ], + options={ + 'verbose_name': '\u5206\u7c7b', + 'verbose_name_plural': '\u5206\u7c7b', + }, + ), + migrations.CreateModel( + name='Post', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=255, verbose_name='\u6807\u9898')), + ('desc', models.CharField(blank=True, max_length=1024, verbose_name='\u6458\u8981')), + ('content', models.TextField(help_text='\u6b63\u6587\u5fc5\u987b\u4e3aMarkDown\u683c\u5f0f', verbose_name='\u6b63\u6587')), + ('status', models.PositiveIntegerField(choices=[(1, '\u6b63\u5e38'), (0, '\u5220\u9664'), (2, '\u8349\u7a3f')], default=1, verbose_name='\u72b6\u6001')), + ('created_time', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')), + ('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='blog.Category', verbose_name='\u5206\u7c7b')), + ('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='\u4f5c\u8005')), + ], + options={ + 'verbose_name': '\u6587\u7ae0', + 'verbose_name_plural': '\u6587\u7ae0', + }, + ), + migrations.CreateModel( + name='Tag', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=10, verbose_name='\u540d\u79f0')), + ('status', models.PositiveIntegerField(choices=[(1, '\u6b63\u5e38'), (0, '\u5220\u9664')], default=1, verbose_name='\u72b6\u6001')), + ('created_time', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')), + ('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='\u4f5c\u8005')), + ], + options={ + 'verbose_name': '\u6807\u7b7e', + 'verbose_name_plural': '\u6807\u7b7e', + }, + ), + migrations.AddField( + model_name='post', + name='tag', + field=models.ManyToManyField(to='blog.Tag', verbose_name='\u6807\u7b7e'), + ), + ] diff --git a/typeidea/comment/migrations/0001_initial.py b/typeidea/comment/migrations/0001_initial.py new file mode 100644 index 0000000..54b9ca7 --- /dev/null +++ b/typeidea/comment/migrations/0001_initial.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.8 on 2018-03-10 03:49 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('blog', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Comment', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('content', models.CharField(max_length=2000, verbose_name='\u5185\u5bb9')), + ('nickname', models.CharField(max_length=50, verbose_name='\u6635\u79f0')), + ('website', models.URLField(verbose_name='\u7f51\u7ad9')), + ('email', models.EmailField(max_length=254, verbose_name='\u90ae\u7bb1')), + ('status', models.PositiveIntegerField(choices=[(1, '\u6b63\u5e38'), (0, '\u5220\u9664')], default=1, verbose_name='\u72b6\u6001')), + ('created_time', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')), + ('target', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='blog.Post', verbose_name='\u8bc4\u8bba\u76ee\u6807')), + ], + options={ + 'verbose_name': '\u8bc4\u8bba', + 'verbose_name_plural': '\u8bc4\u8bba', + }, + ), + ] diff --git a/typeidea/config/migrations/0001_initial.py b/typeidea/config/migrations/0001_initial.py new file mode 100644 index 0000000..b8e1911 --- /dev/null +++ b/typeidea/config/migrations/0001_initial.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.8 on 2018-03-10 03:49 +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='Link', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=50, verbose_name='\u6807\u9898')), + ('href', models.URLField(verbose_name='\u94fe\u63a5')), + ('status', models.PositiveIntegerField(choices=[(1, '\u6b63\u5e38'), (0, '\u5220\u9664')], default=1, verbose_name='\u72b6\u6001')), + ('weight', models.PositiveIntegerField(choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)], default=1, help_text='\u6743\u91cd\u9ad8\u5c55\u793a\u987a\u5e8f\u9760\u524d', verbose_name='\u6743\u91cd')), + ('created_time', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')), + ('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='\u4f5c\u8005')), + ], + options={ + 'verbose_name': '\u53cb\u94fe', + 'verbose_name_plural': '\u53cb\u94fe', + }, + ), + migrations.CreateModel( + name='SideBar', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=50, verbose_name='\u6807\u9898')), + ('display_type', models.PositiveIntegerField(choices=[(1, 'HTML'), (2, '\u6700\u65b0\u6587\u7ae0'), (3, '\u6700\u70ed\u6587\u7ae0'), (4, '\u6700\u8fd1\u8bc4\u8bba')], default=1, verbose_name='\u5c55\u793a\u7c7b\u578b')), + ('content', models.CharField(blank=True, help_text='\u5982\u679c\u8bbe\u7f6e\u7684\u4e0d\u662fHTML\u7c7b\u578b\uff0c\u53ef\u4e3a\u7a7a', max_length=500, verbose_name='\u5185\u5bb9')), + ('status', models.PositiveIntegerField(choices=[(1, '\u5c55\u793a'), (0, '\u9690\u85cf')], default=1, verbose_name='\u72b6\u6001')), + ('created_time', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')), + ('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='\u4f5c\u8005')), + ], + options={ + 'verbose_name': '\u4fa7\u8fb9\u680f', + 'verbose_name_plural': '\u4fa7\u8fb9\u680f', + }, + ), + ] From 93b289e750753dc6565e8a526a89c8b249cd3ee0 Mon Sep 17 00:00:00 2001 From: the5fire Date: Sat, 10 Mar 2018 14:42:47 +0800 Subject: [PATCH 06/97] =?UTF-8?q?=E9=85=8D=E7=BD=AETag=E5=92=8CCategory?= =?UTF-8?q?=E7=9A=84admin=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- typeidea/blog/admin.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/typeidea/blog/admin.py b/typeidea/blog/admin.py index 13be29d..836967f 100644 --- a/typeidea/blog/admin.py +++ b/typeidea/blog/admin.py @@ -3,4 +3,16 @@ from django.contrib import admin -# Register your models here. +from .models import Post, Category, Tag + + +@admin.register(Category) +class CategoryAdmin(admin.ModelAdmin): + list_display = ('name', 'status', 'is_nav', 'created_time') + fields = ('name', 'status', 'is_nav') + + +@admin.register(Tag) +class TagAdmin(admin.ModelAdmin): + list_display = ('name', 'status', 'created_time') + fields = ('name', 'status') From 35b3d790f705c565d17faa2c22fb866fed905e2b Mon Sep 17 00:00:00 2001 From: the5fire Date: Sat, 10 Mar 2018 15:04:58 +0800 Subject: [PATCH 07/97] =?UTF-8?q?=E4=BF=AE=E6=94=B9Category=E7=9A=84author?= =?UTF-8?q?=E4=B8=BAowner?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../migrations/0002_auto_20180310_1505.py | 20 +++++++++++++++++++ typeidea/blog/models.py | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 typeidea/blog/migrations/0002_auto_20180310_1505.py diff --git a/typeidea/blog/migrations/0002_auto_20180310_1505.py b/typeidea/blog/migrations/0002_auto_20180310_1505.py new file mode 100644 index 0000000..b18bbe0 --- /dev/null +++ b/typeidea/blog/migrations/0002_auto_20180310_1505.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.8 on 2018-03-10 07:05 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0001_initial'), + ] + + operations = [ + migrations.RenameField( + model_name='category', + old_name='author', + new_name='owner', + ), + ] diff --git a/typeidea/blog/models.py b/typeidea/blog/models.py index 971093f..5d95615 100644 --- a/typeidea/blog/models.py +++ b/typeidea/blog/models.py @@ -16,7 +16,7 @@ class Category(models.Model): name = models.CharField(max_length=50, verbose_name="名称") status = models.PositiveIntegerField(default=STATUS_NORMAL, choices=STATUS_ITEMS, verbose_name="状态") is_nav = models.BooleanField(default=False, verbose_name="是否为导航") - author = models.ForeignKey(User, verbose_name="作者") + owner = models.ForeignKey(User, verbose_name="作者") created_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") class Meta: From 054209d071ff411c4db22bfc129062405c03d216 Mon Sep 17 00:00:00 2001 From: the5fire Date: Sat, 10 Mar 2018 15:37:59 +0800 Subject: [PATCH 08/97] =?UTF-8?q?=E4=BF=9D=E5=AD=98category=E5=92=8Ctag?= =?UTF-8?q?=E6=98=AF=E8=87=AA=E5=8A=A8=E7=BB=91=E5=AE=9A=E5=BD=93=E5=89=8D?= =?UTF-8?q?=E7=94=A8=E6=88=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- typeidea/blog/admin.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/typeidea/blog/admin.py b/typeidea/blog/admin.py index 836967f..55d7de4 100644 --- a/typeidea/blog/admin.py +++ b/typeidea/blog/admin.py @@ -11,8 +11,16 @@ class CategoryAdmin(admin.ModelAdmin): list_display = ('name', 'status', 'is_nav', 'created_time') fields = ('name', 'status', 'is_nav') + def save_model(self, request, obj, form, change): + obj.owner = request.user + return super(CategoryAdmin, self).save_model(request, obj, form, change) + @admin.register(Tag) class TagAdmin(admin.ModelAdmin): list_display = ('name', 'status', 'created_time') fields = ('name', 'status') + + def save_model(self, request, obj, form, change): + obj.owner = request.user + return super(CategoryAdmin, self).save_model(request, obj, form, change) From d4850428b8de5698a3c96c05650984d236817c37 Mon Sep 17 00:00:00 2001 From: the5fire Date: Sun, 11 Mar 2018 13:27:30 +0800 Subject: [PATCH 09/97] =?UTF-8?q?=E5=A2=9E=E5=8A=A0post=20admin=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- typeidea/blog/admin.py | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/typeidea/blog/admin.py b/typeidea/blog/admin.py index 55d7de4..f0db6db 100644 --- a/typeidea/blog/admin.py +++ b/typeidea/blog/admin.py @@ -2,6 +2,8 @@ from __future__ import unicode_literals from django.contrib import admin +from django.urls import reverse +from django.utils.html import format_html from .models import Post, Category, Tag @@ -23,4 +25,42 @@ class TagAdmin(admin.ModelAdmin): def save_model(self, request, obj, form, change): obj.owner = request.user - return super(CategoryAdmin, self).save_model(request, obj, form, change) + return super(TagAdmin, self).save_model(request, obj, form, change) + + +@admin.register(Post) +class PostAdmin(admin.ModelAdmin): + list_display = [ + 'title', 'category', 'status', + 'created_time', 'operator' + ] + list_display_links = [] + + list_filter = ['category', ] + search_fields = ['title', 'category__name'] + save_on_top = True + + actions_on_top = True + actions_on_bottom = True + + # 编辑页面 + save_on_top = True + + fields = ( + ('category', 'title'), + 'desc', + 'status', + 'content', + 'tag', + ) + + def operator(self, obj): + return format_html( + '编辑', + reverse('admin:blog_post_change', args=(obj.id,)) + ) + operator.short_description = '操作' + + def save_model(self, request, obj, form, change): + obj.owner = request.user + return super(PostAdmin, self).save_model(request, obj, form, change) From 25a4d87dbe8dbf9fd0c261fa595f2db815760062 Mon Sep 17 00:00:00 2001 From: the5fire Date: Sun, 11 Mar 2018 13:49:50 +0800 Subject: [PATCH 10/97] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=96=87=E7=AB=A0?= =?UTF-8?q?=E6=95=B0=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- typeidea/blog/admin.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/typeidea/blog/admin.py b/typeidea/blog/admin.py index f0db6db..161837e 100644 --- a/typeidea/blog/admin.py +++ b/typeidea/blog/admin.py @@ -10,13 +10,18 @@ @admin.register(Category) class CategoryAdmin(admin.ModelAdmin): - list_display = ('name', 'status', 'is_nav', 'created_time') + list_display = ('name', 'status', 'is_nav', 'created_time', 'post_count') fields = ('name', 'status', 'is_nav') def save_model(self, request, obj, form, change): obj.owner = request.user return super(CategoryAdmin, self).save_model(request, obj, form, change) + def post_count(self, obj): + return obj.post_set.count() + + post_count.short_description = '文章数量' + @admin.register(Tag) class TagAdmin(admin.ModelAdmin): From 723ff11e0941683d5e1a7492911bff05fa3e28d5 Mon Sep 17 00:00:00 2001 From: the5fire Date: Sun, 11 Mar 2018 13:51:58 +0800 Subject: [PATCH 11/97] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=5F=5Fstr=5F=5F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- typeidea/blog/models.py | 9 +++++++++ typeidea/config/models.py | 6 ++++++ 2 files changed, 15 insertions(+) diff --git a/typeidea/blog/models.py b/typeidea/blog/models.py index 5d95615..2f7d526 100644 --- a/typeidea/blog/models.py +++ b/typeidea/blog/models.py @@ -22,6 +22,9 @@ class Category(models.Model): class Meta: verbose_name = verbose_name_plural = '分类' + def __str__(self): + return self.name + class Tag(models.Model): STATUS_NORMAL = 1 @@ -39,6 +42,9 @@ class Tag(models.Model): class Meta: verbose_name = verbose_name_plural = '标签' + def __str__(self): + return self.name + class Post(models.Model): STATUS_NORMAL = 1 @@ -61,3 +67,6 @@ class Post(models.Model): class Meta: verbose_name = verbose_name_plural = "文章" + + def __str__(self): + return self.title diff --git a/typeidea/config/models.py b/typeidea/config/models.py index 3ff5730..b3efdce 100644 --- a/typeidea/config/models.py +++ b/typeidea/config/models.py @@ -25,6 +25,9 @@ class Link(models.Model): class Meta: verbose_name = verbose_name_plural = "友链" + def __str__(self): + return self.title + class SideBar(models.Model): STATUS_SHOW = 1 @@ -51,3 +54,6 @@ class SideBar(models.Model): class Meta: verbose_name = verbose_name_plural = "侧边栏" + + def __str__(self): + return self.title From e6f05edf2e2a031c6f5992004285d652640cb518 Mon Sep 17 00:00:00 2001 From: the5fire Date: Sun, 11 Mar 2018 14:05:54 +0800 Subject: [PATCH 12/97] =?UTF-8?q?=E9=85=8D=E7=BD=AEcomment=E5=92=8Cconfig?= =?UTF-8?q?=E7=9A=84admin=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- typeidea/comment/admin.py | 7 ++++++- typeidea/config/admin.py | 22 +++++++++++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/typeidea/comment/admin.py b/typeidea/comment/admin.py index 13be29d..9b16694 100644 --- a/typeidea/comment/admin.py +++ b/typeidea/comment/admin.py @@ -3,4 +3,9 @@ from django.contrib import admin -# Register your models here. +from .models import Comment + + +@admin.register(Comment) +class CommentAdmin(admin.ModelAdmin): + list_display = ('target', 'nickname', 'content', 'website', 'created_time') diff --git a/typeidea/config/admin.py b/typeidea/config/admin.py index 13be29d..5484782 100644 --- a/typeidea/config/admin.py +++ b/typeidea/config/admin.py @@ -3,4 +3,24 @@ from django.contrib import admin -# Register your models here. +from .models import Link, SideBar + + +@admin.register(Link) +class LinkAdmin(admin.ModelAdmin): + list_display = ('title', 'href', 'status', 'weight', 'created_time') + fields = ('title', 'href', 'status', 'weight') + + def save_model(self, request, obj, form, change): + obj.owner = request.user + return super(LinkAdmin, self).save_model(request, obj, form, change) + + +@admin.register(SideBar) +class SideBarAdmin(admin.ModelAdmin): + list_display = ('title', 'display_type', 'content', 'created_time') + fields = ('title', 'display_type', 'content') + + def save_model(self, request, obj, form, change): + obj.owner = request.user + return super(SideBarAdmin, self).save_model(request, obj, form, change) From 65097428157ec1329bbbe1f1f01760ca0adfa7ed Mon Sep 17 00:00:00 2001 From: the5fire Date: Tue, 20 Mar 2018 15:39:22 +0800 Subject: [PATCH 13/97] =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89list=20filter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- typeidea/blog/admin.py | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/typeidea/blog/admin.py b/typeidea/blog/admin.py index 161837e..b452a80 100644 --- a/typeidea/blog/admin.py +++ b/typeidea/blog/admin.py @@ -33,15 +33,31 @@ def save_model(self, request, obj, form, change): return super(TagAdmin, self).save_model(request, obj, form, change) +class CategoryOwnerFilter(admin.SimpleListFilter): + """ 自定义过滤器只展示当前用户分类 """ + + title = '分类过滤器' + parameter_name = 'owner_category' + + def lookups(self, request, model_admin): + return Category.objects.filter(owner=request.user).values_list('id', 'name') + + def queryset(self, request, queryset): + category_id = self.value() + if category_id: + return queryset.filter(category_id=self.value()) + return queryset + + @admin.register(Post) class PostAdmin(admin.ModelAdmin): list_display = [ 'title', 'category', 'status', - 'created_time', 'operator' + 'created_time', 'owner', 'operator' ] list_display_links = [] - list_filter = ['category', ] + list_filter = [CategoryOwnerFilter, ] search_fields = ['title', 'category__name'] save_on_top = True @@ -69,3 +85,7 @@ def operator(self, obj): def save_model(self, request, obj, form, change): obj.owner = request.user return super(PostAdmin, self).save_model(request, obj, form, change) + + def get_queryset(self, request): + qs = super(PostAdmin, self).get_queryset(request) + return qs.filter(owner=request.user) From ba094083936b402b0d7968ef9959d90363d1bbf5 Mon Sep 17 00:00:00 2001 From: the5fire Date: Wed, 21 Mar 2018 15:58:10 +0800 Subject: [PATCH 14/97] =?UTF-8?q?=E5=AE=9A=E5=88=B6post=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=EF=BC=8C=E9=85=8D=E7=BD=AEfieldsets?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- typeidea/blog/admin.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/typeidea/blog/admin.py b/typeidea/blog/admin.py index b452a80..51b980c 100644 --- a/typeidea/blog/admin.py +++ b/typeidea/blog/admin.py @@ -67,6 +67,8 @@ class PostAdmin(admin.ModelAdmin): # 编辑页面 save_on_top = True + exclude = ['owner'] + """ fields = ( ('category', 'title'), 'desc', @@ -74,6 +76,28 @@ class PostAdmin(admin.ModelAdmin): 'content', 'tag', ) + """ + fieldsets = ( + ('基础配置', { + 'description': '基础配置描述', + 'fields': ( + ('title', 'category'), + 'status', + ), + }), + ('内容', { + 'fields': ( + 'desc', + 'content', + ), + }), + ('额外信息', { + 'classes': ('wide',), + 'fields': ('tag', ), + }) + ) + # filter_horizontal = ('tag', ) + filter_vertical = ('tag', ) def operator(self, obj): return format_html( From a1544c35d4743e3c34415446363019c158f9e4d6 Mon Sep 17 00:00:00 2001 From: the5fire Date: Wed, 21 Mar 2018 19:03:31 +0800 Subject: [PATCH 15/97] =?UTF-8?q?=E6=B7=BB=E5=8A=A0adminform?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- typeidea/blog/admin.py | 8 ++++++++ typeidea/blog/adminforms.py | 5 +++++ 2 files changed, 13 insertions(+) create mode 100644 typeidea/blog/adminforms.py diff --git a/typeidea/blog/admin.py b/typeidea/blog/admin.py index 51b980c..9288c46 100644 --- a/typeidea/blog/admin.py +++ b/typeidea/blog/admin.py @@ -5,6 +5,7 @@ from django.urls import reverse from django.utils.html import format_html +from .adminforms import PostAdminForm from .models import Post, Category, Tag @@ -51,6 +52,7 @@ def queryset(self, request, queryset): @admin.register(Post) class PostAdmin(admin.ModelAdmin): + form = PostAdminForm list_display = [ 'title', 'category', 'status', 'created_time', 'owner', 'operator' @@ -113,3 +115,9 @@ def save_model(self, request, obj, form, change): def get_queryset(self, request): qs = super(PostAdmin, self).get_queryset(request) return qs.filter(owner=request.user) + + class Media: + css = { + 'all': ("https://cdn.bootcss.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css", ), + } + js = ('https://cdn.bootcss.com/bootstrap/4.0.0-beta.2/js/bootstrap.bundle.js', ) diff --git a/typeidea/blog/adminforms.py b/typeidea/blog/adminforms.py new file mode 100644 index 0000000..c011bb1 --- /dev/null +++ b/typeidea/blog/adminforms.py @@ -0,0 +1,5 @@ +from django import forms + + +class PostAdminForm(forms.ModelForm): + desc = forms.CharField(widget=forms.Textarea, label='摘要', required=False) From 66f8858e23e428cac36dfb84a93de012121ad5c4 Mon Sep 17 00:00:00 2001 From: the5fire Date: Wed, 21 Mar 2018 19:35:41 +0800 Subject: [PATCH 16/97] =?UTF-8?q?=E9=85=8D=E7=BD=AE=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89site?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- typeidea/blog/admin.py | 16 ++++++++++++---- typeidea/comment/admin.py | 3 ++- typeidea/config/admin.py | 5 +++-- typeidea/typeidea/custom_site.py | 10 ++++++++++ typeidea/typeidea/urls.py | 20 ++++---------------- 5 files changed, 31 insertions(+), 23 deletions(-) create mode 100644 typeidea/typeidea/custom_site.py diff --git a/typeidea/blog/admin.py b/typeidea/blog/admin.py index 9288c46..a3ec0a3 100644 --- a/typeidea/blog/admin.py +++ b/typeidea/blog/admin.py @@ -7,10 +7,18 @@ from .adminforms import PostAdminForm from .models import Post, Category, Tag +from typeidea.custom_site import custom_site -@admin.register(Category) +class PostInline(admin.TabularInline): # StackedInline 样式不同 + fields = ('title', 'desc') + extra = 1 # 控制额外多几个 + model = Post + + +@admin.register(Category, site=custom_site) class CategoryAdmin(admin.ModelAdmin): + inlines = [PostInline, ] list_display = ('name', 'status', 'is_nav', 'created_time', 'post_count') fields = ('name', 'status', 'is_nav') @@ -24,7 +32,7 @@ def post_count(self, obj): post_count.short_description = '文章数量' -@admin.register(Tag) +@admin.register(Tag, site=custom_site) class TagAdmin(admin.ModelAdmin): list_display = ('name', 'status', 'created_time') fields = ('name', 'status') @@ -50,7 +58,7 @@ def queryset(self, request, queryset): return queryset -@admin.register(Post) +@admin.register(Post, site=custom_site) class PostAdmin(admin.ModelAdmin): form = PostAdminForm list_display = [ @@ -104,7 +112,7 @@ class PostAdmin(admin.ModelAdmin): def operator(self, obj): return format_html( '编辑', - reverse('admin:blog_post_change', args=(obj.id,)) + reverse('cus_admin:blog_post_change', args=(obj.id,)) ) operator.short_description = '操作' diff --git a/typeidea/comment/admin.py b/typeidea/comment/admin.py index 9b16694..7179dc7 100644 --- a/typeidea/comment/admin.py +++ b/typeidea/comment/admin.py @@ -4,8 +4,9 @@ from django.contrib import admin from .models import Comment +from typeidea.custom_site import custom_site -@admin.register(Comment) +@admin.register(Comment, site=custom_site) class CommentAdmin(admin.ModelAdmin): list_display = ('target', 'nickname', 'content', 'website', 'created_time') diff --git a/typeidea/config/admin.py b/typeidea/config/admin.py index 5484782..6202f88 100644 --- a/typeidea/config/admin.py +++ b/typeidea/config/admin.py @@ -4,9 +4,10 @@ from django.contrib import admin from .models import Link, SideBar +from typeidea.custom_site import custom_site -@admin.register(Link) +@admin.register(Link, site=custom_site) class LinkAdmin(admin.ModelAdmin): list_display = ('title', 'href', 'status', 'weight', 'created_time') fields = ('title', 'href', 'status', 'weight') @@ -16,7 +17,7 @@ def save_model(self, request, obj, form, change): return super(LinkAdmin, self).save_model(request, obj, form, change) -@admin.register(SideBar) +@admin.register(SideBar, site=custom_site) class SideBarAdmin(admin.ModelAdmin): list_display = ('title', 'display_type', 'content', 'created_time') fields = ('title', 'display_type', 'content') diff --git a/typeidea/typeidea/custom_site.py b/typeidea/typeidea/custom_site.py new file mode 100644 index 0000000..83a2f99 --- /dev/null +++ b/typeidea/typeidea/custom_site.py @@ -0,0 +1,10 @@ +from django.contrib.admin import AdminSite + + +class CustomSite(AdminSite): + site_header = 'Typeidea' + site_title = 'Typeidea管理后台' + index_title = '首页' + + +custom_site = CustomSite(name='cus_admin') diff --git a/typeidea/typeidea/urls.py b/typeidea/typeidea/urls.py index f50f624..c39504f 100644 --- a/typeidea/typeidea/urls.py +++ b/typeidea/typeidea/urls.py @@ -1,21 +1,9 @@ -"""typeidea URL Configuration - -The `urlpatterns` list routes URLs to views. For more information please see: - https://docs.djangoproject.com/en/1.11/topics/http/urls/ -Examples: -Function views - 1. Add an import: from my_app import views - 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') -Class-based views - 1. Add an import: from other_app.views import Home - 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') -Including another URLconf - 1. Import the include() function: from django.conf.urls import url, include - 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) -""" from django.conf.urls import url from django.contrib import admin +from .custom_site import custom_site + urlpatterns = [ - url(r'^admin/', admin.site.urls), + url(r'^super_admin/', admin.site.urls), + url(r'^admin/', custom_site.urls), ] From 4d099c0b54399989384113e3ad3f4227a03c3bf9 Mon Sep 17 00:00:00 2001 From: the5fire Date: Wed, 21 Mar 2018 19:54:00 +0800 Subject: [PATCH 17/97] =?UTF-8?q?=E6=8A=BD=E8=B1=A1=E5=87=BAowneradmin?= =?UTF-8?q?=E5=9F=BA=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- typeidea/blog/admin.py | 7 ++++--- typeidea/config/admin.py | 5 +++-- typeidea/typeidea/base_admin.py | 17 +++++++++++++++++ 3 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 typeidea/typeidea/base_admin.py diff --git a/typeidea/blog/admin.py b/typeidea/blog/admin.py index a3ec0a3..1310628 100644 --- a/typeidea/blog/admin.py +++ b/typeidea/blog/admin.py @@ -8,6 +8,7 @@ from .adminforms import PostAdminForm from .models import Post, Category, Tag from typeidea.custom_site import custom_site +from typeidea.base_admin import BaseOwnerAdmin class PostInline(admin.TabularInline): # StackedInline 样式不同 @@ -17,7 +18,7 @@ class PostInline(admin.TabularInline): # StackedInline 样式不同 @admin.register(Category, site=custom_site) -class CategoryAdmin(admin.ModelAdmin): +class CategoryAdmin(BaseOwnerAdmin): inlines = [PostInline, ] list_display = ('name', 'status', 'is_nav', 'created_time', 'post_count') fields = ('name', 'status', 'is_nav') @@ -33,7 +34,7 @@ def post_count(self, obj): @admin.register(Tag, site=custom_site) -class TagAdmin(admin.ModelAdmin): +class TagAdmin(BaseOwnerAdmin): list_display = ('name', 'status', 'created_time') fields = ('name', 'status') @@ -59,7 +60,7 @@ def queryset(self, request, queryset): @admin.register(Post, site=custom_site) -class PostAdmin(admin.ModelAdmin): +class PostAdmin(BaseOwnerAdmin): form = PostAdminForm list_display = [ 'title', 'category', 'status', diff --git a/typeidea/config/admin.py b/typeidea/config/admin.py index 6202f88..b5bfde4 100644 --- a/typeidea/config/admin.py +++ b/typeidea/config/admin.py @@ -5,10 +5,11 @@ from .models import Link, SideBar from typeidea.custom_site import custom_site +from typeidea.base_admin import BaseOwnerAdmin @admin.register(Link, site=custom_site) -class LinkAdmin(admin.ModelAdmin): +class LinkAdmin(BaseOwnerAdmin): list_display = ('title', 'href', 'status', 'weight', 'created_time') fields = ('title', 'href', 'status', 'weight') @@ -18,7 +19,7 @@ def save_model(self, request, obj, form, change): @admin.register(SideBar, site=custom_site) -class SideBarAdmin(admin.ModelAdmin): +class SideBarAdmin(BaseOwnerAdmin): list_display = ('title', 'display_type', 'content', 'created_time') fields = ('title', 'display_type', 'content') diff --git a/typeidea/typeidea/base_admin.py b/typeidea/typeidea/base_admin.py new file mode 100644 index 0000000..deacd8e --- /dev/null +++ b/typeidea/typeidea/base_admin.py @@ -0,0 +1,17 @@ +from django.contrib import admin + + +class BaseOwnerAdmin(admin.ModelAdmin): + """ + 1. 用来处理文章、分类、标签、侧边栏、友链这些model的owner字段自动补充 + 2. 用来针对queryset过滤当前用户的数据 + """ + exclude = ('owner', ) + + def get_queryset(self, request): + qs = super(BaseOwnerAdmin, self).get_queryset(request) + return qs.filter(owner=request.user) + + def save_model(self, request, obj, form, change): + obj.owner = request.user + return super(BaseOwnerAdmin, self).save_model(request, obj, form, change) From b4ab72a2119b808eff9e9c9e411a247f12d0cb31 Mon Sep 17 00:00:00 2001 From: the5fire Date: Sun, 25 Mar 2018 10:50:51 +0800 Subject: [PATCH 18/97] =?UTF-8?q?=E5=A2=9E=E5=8A=A0logentry=E7=9A=84?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- typeidea/blog/admin.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/typeidea/blog/admin.py b/typeidea/blog/admin.py index 1310628..0721ab8 100644 --- a/typeidea/blog/admin.py +++ b/typeidea/blog/admin.py @@ -2,9 +2,11 @@ from __future__ import unicode_literals from django.contrib import admin +from django.contrib.admin.models import LogEntry from django.urls import reverse from django.utils.html import format_html + from .adminforms import PostAdminForm from .models import Post, Category, Tag from typeidea.custom_site import custom_site @@ -130,3 +132,8 @@ class Media: 'all': ("https://cdn.bootcss.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css", ), } js = ('https://cdn.bootcss.com/bootstrap/4.0.0-beta.2/js/bootstrap.bundle.js', ) + + +@admin.register(LogEntry, site=custom_site) +class LogEntryAdmin(admin.ModelAdmin): + list_display = ['object_repr', 'object_id', 'action_flag', 'user', 'change_message'] From 4865dab51b159906122edb696ff98cd743ec3280 Mon Sep 17 00:00:00 2001 From: the5fire Date: Sun, 25 Mar 2018 12:13:52 +0800 Subject: [PATCH 19/97] =?UTF-8?q?=E7=AE=80=E5=8D=95=E7=9A=84=E9=85=8D?= =?UTF-8?q?=E7=BD=AEurl=E5=92=8Cviews?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- typeidea/blog/views.py | 16 ++++++++++++---- typeidea/config/views.py | 7 +++---- typeidea/typeidea/urls.py | 7 +++++++ 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/typeidea/blog/views.py b/typeidea/blog/views.py index e784a0b..9268397 100644 --- a/typeidea/blog/views.py +++ b/typeidea/blog/views.py @@ -1,6 +1,14 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals +from django.http import HttpResponse -from django.shortcuts import render -# Create your views here. +def post_list(request, category_id=None, tag_id=None): + content = 'post_list category_id={category_id}, tag_id={tag_id}'.format( + category_id=category_id, + tag_id=tag_id, + ) + + return HttpResponse(content) + + +def post_detail(request, post_id): + return HttpResponse('detail') diff --git a/typeidea/config/views.py b/typeidea/config/views.py index e784a0b..8e045c5 100644 --- a/typeidea/config/views.py +++ b/typeidea/config/views.py @@ -1,6 +1,5 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals +from django.http import HttpResponse -from django.shortcuts import render -# Create your views here. +def links(request): + return HttpResponse('links') diff --git a/typeidea/typeidea/urls.py b/typeidea/typeidea/urls.py index c39504f..fcde1ca 100644 --- a/typeidea/typeidea/urls.py +++ b/typeidea/typeidea/urls.py @@ -1,9 +1,16 @@ from django.conf.urls import url from django.contrib import admin +from blog.views import post_list, post_detail +from config.views import links from .custom_site import custom_site urlpatterns = [ + url(r'^$', post_list), + url(r'^category/(?P\d+)/$', post_list), + url(r'^tag/(?P\d+)/$', post_list), + url(r'^post/(?P\d+).html$', post_detail), + url(r'^links/$', links), url(r'^super_admin/', admin.site.urls), url(r'^admin/', custom_site.urls), ] From 2b29e8e5e63db97b4966eb8ca659ef8356578b1c Mon Sep 17 00:00:00 2001 From: the5fire Date: Sun, 25 Mar 2018 12:36:13 +0800 Subject: [PATCH 20/97] =?UTF-8?q?=E9=85=8D=E7=BD=AEtemplate=E7=9A=84?= =?UTF-8?q?=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- typeidea/blog/views.py | 13 ++++--------- typeidea/typeidea/settings/base.py | 1 + typeidea/typeidea/templates/blog/detail.html | 0 typeidea/typeidea/templates/blog/list.html | 0 typeidea/typeidea/templates/config/links.html | 0 5 files changed, 5 insertions(+), 9 deletions(-) create mode 100644 typeidea/typeidea/templates/blog/detail.html create mode 100644 typeidea/typeidea/templates/blog/list.html create mode 100644 typeidea/typeidea/templates/config/links.html diff --git a/typeidea/blog/views.py b/typeidea/blog/views.py index 9268397..48b9dbe 100644 --- a/typeidea/blog/views.py +++ b/typeidea/blog/views.py @@ -1,14 +1,9 @@ -from django.http import HttpResponse +from django.shortcuts import render def post_list(request, category_id=None, tag_id=None): - content = 'post_list category_id={category_id}, tag_id={tag_id}'.format( - category_id=category_id, - tag_id=tag_id, - ) + return render(request, 'blog/list.html', context={'name': 'post_list'}) - return HttpResponse(content) - -def post_detail(request, post_id): - return HttpResponse('detail') +def post_detail(request, post_id=None): + return render(request, 'blog/detail.html', context={'name': 'post_detail'}) diff --git a/typeidea/typeidea/settings/base.py b/typeidea/typeidea/settings/base.py index 122f5ef..34fd3ef 100644 --- a/typeidea/typeidea/settings/base.py +++ b/typeidea/typeidea/settings/base.py @@ -31,6 +31,7 @@ # Application definition INSTALLED_APPS = [ + 'typeidea', 'blog', 'config', 'comment', diff --git a/typeidea/typeidea/templates/blog/detail.html b/typeidea/typeidea/templates/blog/detail.html new file mode 100644 index 0000000..e69de29 diff --git a/typeidea/typeidea/templates/blog/list.html b/typeidea/typeidea/templates/blog/list.html new file mode 100644 index 0000000..e69de29 diff --git a/typeidea/typeidea/templates/config/links.html b/typeidea/typeidea/templates/config/links.html new file mode 100644 index 0000000..e69de29 From 23f1e07094002e04963c2dc78a6c9454b5fdd79e Mon Sep 17 00:00:00 2001 From: the5fire Date: Sun, 25 Mar 2018 15:44:48 +0800 Subject: [PATCH 21/97] =?UTF-8?q?=E7=AE=80=E5=8D=95=E5=B1=95=E7=A4=BAmodel?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E6=8D=AE=E5=88=B0=E6=A8=A1=E6=9D=BF=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- typeidea/blog/views.py | 22 ++++++++++++++++++-- typeidea/typeidea/templates/blog/detail.html | 11 ++++++++++ typeidea/typeidea/templates/blog/list.html | 13 ++++++++++++ 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/typeidea/blog/views.py b/typeidea/blog/views.py index 48b9dbe..1ddacb3 100644 --- a/typeidea/blog/views.py +++ b/typeidea/blog/views.py @@ -1,9 +1,27 @@ from django.shortcuts import render +from .models import Post, Tag + def post_list(request, category_id=None, tag_id=None): - return render(request, 'blog/list.html', context={'name': 'post_list'}) + if tag_id: + try: + tag = Tag.objects.get(id=tag_id) + except Tag.DoesNotExist: + post_list = [] + else: + post_list = tag.post_set.filter(status=Post.STATUS_NORMAL) + else: + post_list = Post.objects.filter(status=Post.STATUS_NORMAL) + if category_id: + post_list = post_list.filter(category_id=category_id) + + return render(request, 'blog/list.html', context={'post_list': post_list}) def post_detail(request, post_id=None): - return render(request, 'blog/detail.html', context={'name': 'post_detail'}) + try: + post = Post.objects.get(id=post_id) + except Post.DoesNotExist: + post = None + return render(request, 'blog/detail.html', context={'post': post}) diff --git a/typeidea/typeidea/templates/blog/detail.html b/typeidea/typeidea/templates/blog/detail.html index e69de29..a541806 100644 --- a/typeidea/typeidea/templates/blog/detail.html +++ b/typeidea/typeidea/templates/blog/detail.html @@ -0,0 +1,11 @@ +{% if post %} +

{{ post.title }}

+
+ 分类:{{ post.category.name }} + 作者:{{ post.owner.username }} +
+
+

+ {{ post.content }} +

+{% endif %} diff --git a/typeidea/typeidea/templates/blog/list.html b/typeidea/typeidea/templates/blog/list.html index e69de29..70b31a7 100644 --- a/typeidea/typeidea/templates/blog/list.html +++ b/typeidea/typeidea/templates/blog/list.html @@ -0,0 +1,13 @@ +
    +{% for post in post_list %} +
  • + {{ post.title }} +
    + 作者:{{ post.owner.username }} + 分类:{{ post.category.name }} +
    +

    {{ post.desc }}

    +
  • +{% endfor %} +
+ From 9cbb546d9ca9773ca948c2ea3dfd56ba66cfc8eb Mon Sep 17 00:00:00 2001 From: the5fire Date: Sun, 25 Mar 2018 15:52:12 +0800 Subject: [PATCH 22/97] =?UTF-8?q?=E5=8C=BA=E5=88=86=E9=A6=96=E9=A1=B5?= =?UTF-8?q?=E3=80=81=E5=88=86=E7=B1=BB=E9=A1=B5=E3=80=81=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- typeidea/blog/views.py | 19 ++++++++++++++++--- typeidea/typeidea/templates/blog/list.html | 8 ++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/typeidea/blog/views.py b/typeidea/blog/views.py index 1ddacb3..c26662e 100644 --- a/typeidea/blog/views.py +++ b/typeidea/blog/views.py @@ -1,9 +1,12 @@ from django.shortcuts import render -from .models import Post, Tag +from .models import Post, Tag, Category def post_list(request, category_id=None, tag_id=None): + tag = None + category = None + if tag_id: try: tag = Tag.objects.get(id=tag_id) @@ -14,9 +17,19 @@ def post_list(request, category_id=None, tag_id=None): else: post_list = Post.objects.filter(status=Post.STATUS_NORMAL) if category_id: - post_list = post_list.filter(category_id=category_id) + try: + category = Category.objects.get(id=category_id) + except Category.DoesNotExist: + category = None + else: + post_list = post_list.filter(category_id=category_id) - return render(request, 'blog/list.html', context={'post_list': post_list}) + context = { + 'category': category, + 'tag': tag, + 'post_list': post_list, + } + return render(request, 'blog/list.html', context=context) def post_detail(request, post_id=None): diff --git a/typeidea/typeidea/templates/blog/list.html b/typeidea/typeidea/templates/blog/list.html index 70b31a7..9443a24 100644 --- a/typeidea/typeidea/templates/blog/list.html +++ b/typeidea/typeidea/templates/blog/list.html @@ -1,3 +1,11 @@ +{% if tag %} +标签页: {{ tag.name }} +{% endif %} + +{% if category %} +分类页: {{ category.name }} +{% endif %} +
    {% for post in post_list %}
  • From 6e39c340a41b4d8993ecbd98efa25a8d3227ad77 Mon Sep 17 00:00:00 2001 From: the5fire Date: Sun, 25 Mar 2018 16:32:54 +0800 Subject: [PATCH 23/97] =?UTF-8?q?=E9=87=8D=E6=9E=84views=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E5=A4=8Dn+1=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- typeidea/blog/models.py | 24 ++++++++++++++++++++++++ typeidea/blog/views.py | 21 ++++++--------------- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/typeidea/blog/models.py b/typeidea/blog/models.py index 2f7d526..775a4ee 100644 --- a/typeidea/blog/models.py +++ b/typeidea/blog/models.py @@ -70,3 +70,27 @@ class Meta: def __str__(self): return self.title + + @staticmethod + def get_by_tag(tag_id): + try: + tag = Tag.objects.get(id=tag_id) + except Tag.DoesNotExist: + tag = None + post_list = [] + else: + post_list = tag.post_set.filter(status=Post.STATUS_NORMAL)\ + .select_related('owner', 'category') + return post_list, tag + + @staticmethod + def get_by_category(category_id): + try: + category = Category.objects.get(id=category_id) + except Category.DoesNotExist: + category = None + post_list = [] + else: + post_list = category.post_set.filter(status=Post.STATUS_NORMAL)\ + .select_related('owner', 'category') + return post_list, category diff --git a/typeidea/blog/views.py b/typeidea/blog/views.py index c26662e..3613c50 100644 --- a/typeidea/blog/views.py +++ b/typeidea/blog/views.py @@ -1,6 +1,6 @@ from django.shortcuts import render -from .models import Post, Tag, Category +from .models import Post def post_list(request, category_id=None, tag_id=None): @@ -8,21 +8,12 @@ def post_list(request, category_id=None, tag_id=None): category = None if tag_id: - try: - tag = Tag.objects.get(id=tag_id) - except Tag.DoesNotExist: - post_list = [] - else: - post_list = tag.post_set.filter(status=Post.STATUS_NORMAL) + post_list, tag = Post.get_by_tag(tag_id) + elif category_id: + post_list, category = Post.get_by_category(category_id) else: - post_list = Post.objects.filter(status=Post.STATUS_NORMAL) - if category_id: - try: - category = Category.objects.get(id=category_id) - except Category.DoesNotExist: - category = None - else: - post_list = post_list.filter(category_id=category_id) + post_list = Post.objects.filter(status=Post.STATUS_NORMAL)\ + .select_related('owner', 'category') context = { 'category': category, From 7195d8ec9bf2bdc71e222cd91f5d93cc82b59fb3 Mon Sep 17 00:00:00 2001 From: the5fire Date: Sun, 25 Mar 2018 16:33:59 +0800 Subject: [PATCH 24/97] =?UTF-8?q?=E5=AE=8C=E5=96=84html=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- typeidea/typeidea/templates/blog/detail.html | 32 +++++++++----- typeidea/typeidea/templates/blog/list.html | 46 ++++++++++++-------- 2 files changed, 49 insertions(+), 29 deletions(-) diff --git a/typeidea/typeidea/templates/blog/detail.html b/typeidea/typeidea/templates/blog/detail.html index a541806..c06f0fb 100644 --- a/typeidea/typeidea/templates/blog/detail.html +++ b/typeidea/typeidea/templates/blog/detail.html @@ -1,11 +1,21 @@ -{% if post %} -

    {{ post.title }}

    -
    - 分类:{{ post.category.name }} - 作者:{{ post.owner.username }} -
    -
    -

    - {{ post.content }} -

    -{% endif %} + + + + + typeidea博客系统 + + + + {% if post %} +

    {{ post.title }}

    +
    + 分类:{{ post.category.name }} + 作者:{{ post.owner.username }} +
    +
    +

    + {{ post.content }} +

    + {% endif %} + + diff --git a/typeidea/typeidea/templates/blog/list.html b/typeidea/typeidea/templates/blog/list.html index 9443a24..2731bff 100644 --- a/typeidea/typeidea/templates/blog/list.html +++ b/typeidea/typeidea/templates/blog/list.html @@ -1,21 +1,31 @@ -{% if tag %} -标签页: {{ tag.name }} -{% endif %} + + + + + typeidea博客系统 + + -{% if category %} -分类页: {{ category.name }} -{% endif %} + {% if tag %} + 标签页: {{ tag.name }} + {% endif %} -
      -{% for post in post_list %} -
    • - {{ post.title }} -
      - 作者:{{ post.owner.username }} - 分类:{{ post.category.name }} -
      -

      {{ post.desc }}

      -
    • -{% endfor %} -
    + {% if category %} + 分类页: {{ category.name }} + {% endif %} + +
      + {% for post in post_list %} +
    • + {{ post.title }} +
      + 作者:{{ post.owner.username }} + 分类:{{ post.category.name }} +
      +

      {{ post.desc }}

      +
    • + {% endfor %} +
    + + From 5a6bd073ed539bf398246942c5d2f5a991ea5ad2 Mon Sep 17 00:00:00 2001 From: the5fire Date: Sun, 25 Mar 2018 16:59:10 +0800 Subject: [PATCH 25/97] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=88=86=E7=B1=BB?= =?UTF-8?q?=E5=AF=BC=E8=88=AA=E7=9A=84=E6=B8=B2=E6=9F=93=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- typeidea/blog/views.py | 26 ++++++++++++++++++++-- typeidea/typeidea/templates/blog/list.html | 12 ++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/typeidea/blog/views.py b/typeidea/blog/views.py index 3613c50..62f65ec 100644 --- a/typeidea/blog/views.py +++ b/typeidea/blog/views.py @@ -1,6 +1,6 @@ from django.shortcuts import render -from .models import Post +from .models import Post, Category def post_list(request, category_id=None, tag_id=None): @@ -20,6 +20,7 @@ def post_list(request, category_id=None, tag_id=None): 'tag': tag, 'post_list': post_list, } + context.update(get_navs()) return render(request, 'blog/list.html', context=context) @@ -28,4 +29,25 @@ def post_detail(request, post_id=None): post = Post.objects.get(id=post_id) except Post.DoesNotExist: post = None - return render(request, 'blog/detail.html', context={'post': post}) + + context = { + 'post': post, + } + context.update(get_navs()) + return render(request, 'blog/detail.html', context=context) + + +def get_navs(): + categories = Category.objects.filter(status=Category.STATUS_NORMAL) + nav_categories = [] + normal_categories = [] + for cate in categories: + if cate.is_nav: + nav_categories.append(cate) + else: + normal_categories.append(cate) + + return { + 'navs': nav_categories, + 'categories': normal_categories, + } diff --git a/typeidea/typeidea/templates/blog/list.html b/typeidea/typeidea/templates/blog/list.html index 2731bff..e2335df 100644 --- a/typeidea/typeidea/templates/blog/list.html +++ b/typeidea/typeidea/templates/blog/list.html @@ -5,6 +5,12 @@ typeidea博客系统 +
    顶部分类: + {% for cate in navs %} + {{ cate.name }} + {% endfor %} +
    +
    {% if tag %} 标签页: {{ tag.name }} @@ -26,6 +32,12 @@
  • {% endfor %}
+
+
底部分类: + {% for cate in categories %} + {{ cate.name }} + {% endfor %} +
From c9401647fcd2f208b2ab79a1be71bd532ddb282d Mon Sep 17 00:00:00 2001 From: the5fire Date: Sun, 25 Mar 2018 17:34:08 +0800 Subject: [PATCH 26/97] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BE=A7=E8=BE=B9?= =?UTF-8?q?=E6=A0=8F=E6=95=B0=E6=8D=AE=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- typeidea/blog/views.py | 7 +++++++ typeidea/typeidea/templates/blog/detail.html | 8 ++++++++ typeidea/typeidea/templates/blog/list.html | 18 +++++++++++++----- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/typeidea/blog/views.py b/typeidea/blog/views.py index 62f65ec..b469bb0 100644 --- a/typeidea/blog/views.py +++ b/typeidea/blog/views.py @@ -1,5 +1,6 @@ from django.shortcuts import render +from config.models import SideBar from .models import Post, Category @@ -19,6 +20,7 @@ def post_list(request, category_id=None, tag_id=None): 'category': category, 'tag': tag, 'post_list': post_list, + 'sidebars': get_sidebars(), } context.update(get_navs()) return render(request, 'blog/list.html', context=context) @@ -32,6 +34,7 @@ def post_detail(request, post_id=None): context = { 'post': post, + 'sidebars': get_sidebars(), } context.update(get_navs()) return render(request, 'blog/detail.html', context=context) @@ -51,3 +54,7 @@ def get_navs(): 'navs': nav_categories, 'categories': normal_categories, } + + +def get_sidebars(): + return SideBar.objects.filter(status=SideBar.STATUS_SHOW) diff --git a/typeidea/typeidea/templates/blog/detail.html b/typeidea/typeidea/templates/blog/detail.html index c06f0fb..ec0b65c 100644 --- a/typeidea/typeidea/templates/blog/detail.html +++ b/typeidea/typeidea/templates/blog/detail.html @@ -17,5 +17,13 @@

{{ post.title }}

{{ post.content }}

{% endif %} + +
+
侧边栏展示: + {% for sidebar in sidebars %} +

{{ sidebar.title }}

+ {{ sidebar.content }} + {% endfor %} +
diff --git a/typeidea/typeidea/templates/blog/list.html b/typeidea/typeidea/templates/blog/list.html index e2335df..937d1d7 100644 --- a/typeidea/typeidea/templates/blog/list.html +++ b/typeidea/typeidea/templates/blog/list.html @@ -33,11 +33,19 @@ {% endfor %}
-
底部分类: - {% for cate in categories %} - {{ cate.name }} - {% endfor %} -
+
底部分类: + {% for cate in categories %} + {{ cate.name }} + {% endfor %} +
+ +
+
侧边栏展示: + {% for sidebar in sidebars %} +

{{ sidebar.title }}

+ {{ sidebar.content }} + {% endfor %} +
From 59644e77bc3c678b12514a2a58bd743334bff54c Mon Sep 17 00:00:00 2001 From: the5fire Date: Sun, 25 Mar 2018 17:48:17 +0800 Subject: [PATCH 27/97] =?UTF-8?q?=E4=BF=AE=E6=94=B9post=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=8A=A0pv=20uv=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../migrations/0003_auto_20180325_1737.py | 25 +++++++++++++++++++ typeidea/blog/models.py | 11 ++++++++ 2 files changed, 36 insertions(+) create mode 100644 typeidea/blog/migrations/0003_auto_20180325_1737.py diff --git a/typeidea/blog/migrations/0003_auto_20180325_1737.py b/typeidea/blog/migrations/0003_auto_20180325_1737.py new file mode 100644 index 0000000..7ef8c9c --- /dev/null +++ b/typeidea/blog/migrations/0003_auto_20180325_1737.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.11 on 2018-03-25 09:37 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0002_auto_20180310_1505'), + ] + + operations = [ + migrations.AddField( + model_name='post', + name='pv', + field=models.PositiveIntegerField(default=1), + ), + migrations.AddField( + model_name='post', + name='uv', + field=models.PositiveIntegerField(default=1), + ), + ] diff --git a/typeidea/blog/models.py b/typeidea/blog/models.py index 775a4ee..64891f8 100644 --- a/typeidea/blog/models.py +++ b/typeidea/blog/models.py @@ -65,6 +65,9 @@ class Post(models.Model): owner = models.ForeignKey(User, verbose_name="作者") created_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") + pv = models.PositiveIntegerField(default=1) + uv = models.PositiveIntegerField(default=1) + class Meta: verbose_name = verbose_name_plural = "文章" @@ -94,3 +97,11 @@ def get_by_category(category_id): post_list = category.post_set.filter(status=Post.STATUS_NORMAL)\ .select_related('owner', 'category') return post_list, category + + @classmethod + def latest_posts(cls): + return cls.objects.filter(status=cls.STATUS_NORMAL) + + @classmethod + def hot_posts(cls): + return cls.objects.filter(status=cls.STATUS_NORMAL).ordery_by('-pv') From 676f35e90b2ffeb946e1c28cd9155d781c2a2d40 Mon Sep 17 00:00:00 2001 From: the5fire Date: Sun, 1 Apr 2018 12:38:02 +0800 Subject: [PATCH 28/97] =?UTF-8?q?=E5=B0=81=E8=A3=85sidebar=E6=95=B0?= =?UTF-8?q?=E6=8D=AE(=E5=AF=B9=E5=BA=9407-03)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- typeidea/config/models.py | 41 +++++++++++++++++-- typeidea/typeidea/templates/blog/list.html | 2 +- .../config/blocks/sidebar_comments.html | 5 +++ .../config/blocks/sidebar_posts.html | 5 +++ 4 files changed, 48 insertions(+), 5 deletions(-) create mode 100644 typeidea/typeidea/templates/config/blocks/sidebar_comments.html create mode 100644 typeidea/typeidea/templates/config/blocks/sidebar_posts.html diff --git a/typeidea/config/models.py b/typeidea/config/models.py index b3efdce..81ec923 100644 --- a/typeidea/config/models.py +++ b/typeidea/config/models.py @@ -3,6 +3,7 @@ from django.contrib.auth.models import User from django.db import models +from django.template.loader import render_to_string class Link(models.Model): @@ -36,11 +37,15 @@ class SideBar(models.Model): (STATUS_SHOW, '展示'), (STATUS_HIDE, '隐藏'), ) + DISPLAY_HTML = 1 + DISPLAY_LATEST = 2 + DISPLAY_HOT = 3 + DISPLAY_COMMENT = 4 SIDE_TYPE = ( - (1, 'HTML'), - (2, '最新文章'), - (3, '最热文章'), - (4, '最近评论'), + (DISPLAY_HTML, 'HTML'), + (DISPLAY_LATEST, '最新文章'), + (DISPLAY_HOT, '最热文章'), + (DISPLAY_COMMENT, '最近评论'), ) title = models.CharField(max_length=50, verbose_name="标题") display_type = models.PositiveIntegerField(default=1, choices=SIDE_TYPE, @@ -57,3 +62,31 @@ class Meta: def __str__(self): return self.title + + def _render_latest(self): + pass + + def content_html(self): + """ 通过直接渲染模板 """ + from blog.models import Post # 避免循环引用 + from comment.models import Comment + + result = '' + if self.display_type == self.DISPLAY_HTML: + result = self.content + elif self.display_type == self.DISPLAY_LATEST: + context = { + 'posts': Post.latest_posts() + } + result = render_to_string('config/blocks/sidebar_posts.html', context) + elif self.display_type == self.DISPLAY_HOT: + context = { + 'posts': Post.hot_posts() + } + result = render_to_string('config/blocks/sidebar_posts.html', context) + elif self.display_type == self.DISPLAY_COMMENT: + context = { + 'comments': Comment.objects.filter(status=Comment.STATUS_NORMAL) + } + result = render_to_string('config/blocks/sidebar_comments.html', context) + return result diff --git a/typeidea/typeidea/templates/blog/list.html b/typeidea/typeidea/templates/blog/list.html index 937d1d7..89bb6da 100644 --- a/typeidea/typeidea/templates/blog/list.html +++ b/typeidea/typeidea/templates/blog/list.html @@ -43,7 +43,7 @@
侧边栏展示: {% for sidebar in sidebars %}

{{ sidebar.title }}

- {{ sidebar.content }} + {{ sidebar.content_html }} {% endfor %}
diff --git a/typeidea/typeidea/templates/config/blocks/sidebar_comments.html b/typeidea/typeidea/templates/config/blocks/sidebar_comments.html new file mode 100644 index 0000000..1c92c0c --- /dev/null +++ b/typeidea/typeidea/templates/config/blocks/sidebar_comments.html @@ -0,0 +1,5 @@ + diff --git a/typeidea/typeidea/templates/config/blocks/sidebar_posts.html b/typeidea/typeidea/templates/config/blocks/sidebar_posts.html new file mode 100644 index 0000000..bce6ada --- /dev/null +++ b/typeidea/typeidea/templates/config/blocks/sidebar_posts.html @@ -0,0 +1,5 @@ + From 7c17a039a89c29d7c72dea72ec0c858707496e5b Mon Sep 17 00:00:00 2001 From: the5fire Date: Thu, 5 Apr 2018 12:18:43 +0800 Subject: [PATCH 29/97] =?UTF-8?q?=E6=95=B4=E7=90=86=E6=8A=BD=E8=B1=A1?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- typeidea/typeidea/templates/blog/base.html | 34 +++++++++++++++ typeidea/typeidea/templates/blog/detail.html | 21 ++-------- typeidea/typeidea/templates/blog/list.html | 42 ++++--------------- .../config/blocks/sidebar_comments.html | 2 +- .../config/blocks/sidebar_posts.html | 2 +- typeidea/typeidea/urls.py | 14 +++---- 6 files changed, 55 insertions(+), 60 deletions(-) create mode 100644 typeidea/typeidea/templates/blog/base.html diff --git a/typeidea/typeidea/templates/blog/base.html b/typeidea/typeidea/templates/blog/base.html new file mode 100644 index 0000000..364b7a3 --- /dev/null +++ b/typeidea/typeidea/templates/blog/base.html @@ -0,0 +1,34 @@ + + + + + {% block title %}首页{% endblock %}- typeidea博客系统 + + +
顶部分类: + {% for cate in navs %} + {{ cate.name }} + {% endfor %} +
+
+ + {% block main %} + {% endblock %} + +
+
底部分类: + {% for cate in categories %} + {{ cate.name }} + {% endfor %} +
+ +
+
侧边栏展示: + {% for sidebar in sidebars %} +

{{ sidebar.title }}

+ {{ sidebar.content_html }} + {% endfor %} +
+ + + diff --git a/typeidea/typeidea/templates/blog/detail.html b/typeidea/typeidea/templates/blog/detail.html index ec0b65c..65ecc1d 100644 --- a/typeidea/typeidea/templates/blog/detail.html +++ b/typeidea/typeidea/templates/blog/detail.html @@ -1,11 +1,7 @@ - - - - - typeidea博客系统 - - +{% extends "./base.html" %} +{% block title %} {{ post.title }} {% endblock %} +{% block main %} {% if post %}

{{ post.title }}

@@ -17,13 +13,4 @@

{{ post.title }}

{{ post.content }}

{% endif %} - -
-
侧边栏展示: - {% for sidebar in sidebars %} -

{{ sidebar.title }}

- {{ sidebar.content }} - {% endfor %} -
- - +{% endblock %} diff --git a/typeidea/typeidea/templates/blog/list.html b/typeidea/typeidea/templates/blog/list.html index 89bb6da..a040466 100644 --- a/typeidea/typeidea/templates/blog/list.html +++ b/typeidea/typeidea/templates/blog/list.html @@ -1,29 +1,19 @@ - - - - - typeidea博客系统 - - -
顶部分类: - {% for cate in navs %} - {{ cate.name }} - {% endfor %} -
-
+{% extends "./base.html" %} +{% block title %} {% if tag %} 标签页: {{ tag.name }} - {% endif %} - - {% if category %} + {% elif category %} 分类页: {{ category.name }} {% endif %} +{% endblock %} + +{% block main %}
    {% for post in post_list %}
  • - {{ post.title }} + {{ post.title }}
    作者:{{ post.owner.username }} 分类:{{ post.category.name }} @@ -32,20 +22,4 @@
  • {% endfor %}
-
-
底部分类: - {% for cate in categories %} - {{ cate.name }} - {% endfor %} -
- -
-
侧边栏展示: - {% for sidebar in sidebars %} -

{{ sidebar.title }}

- {{ sidebar.content_html }} - {% endfor %} -
- - - +{% endblock %} diff --git a/typeidea/typeidea/templates/config/blocks/sidebar_comments.html b/typeidea/typeidea/templates/config/blocks/sidebar_comments.html index 1c92c0c..30238c1 100644 --- a/typeidea/typeidea/templates/config/blocks/sidebar_comments.html +++ b/typeidea/typeidea/templates/config/blocks/sidebar_comments.html @@ -1,5 +1,5 @@ diff --git a/typeidea/typeidea/templates/config/blocks/sidebar_posts.html b/typeidea/typeidea/templates/config/blocks/sidebar_posts.html index bce6ada..d933d46 100644 --- a/typeidea/typeidea/templates/config/blocks/sidebar_posts.html +++ b/typeidea/typeidea/templates/config/blocks/sidebar_posts.html @@ -1,5 +1,5 @@ diff --git a/typeidea/typeidea/urls.py b/typeidea/typeidea/urls.py index fcde1ca..75f2fd4 100644 --- a/typeidea/typeidea/urls.py +++ b/typeidea/typeidea/urls.py @@ -6,11 +6,11 @@ from .custom_site import custom_site urlpatterns = [ - url(r'^$', post_list), - url(r'^category/(?P\d+)/$', post_list), - url(r'^tag/(?P\d+)/$', post_list), - url(r'^post/(?P\d+).html$', post_detail), - url(r'^links/$', links), - url(r'^super_admin/', admin.site.urls), - url(r'^admin/', custom_site.urls), + url(r'^$', post_list, name='index'), + url(r'^category/(?P\d+)/$', post_list, name='category-list'), + url(r'^tag/(?P\d+)/$', post_list, name='tag-list'), + url(r'^post/(?P\d+).html$', post_detail, name='post-detail'), + url(r'^links/$', links, name='links'), + url(r'^super_admin/', admin.site.urls, name='super-admin'), + url(r'^admin/', custom_site.urls, name='admin'), ] From eb9fab62c1e4f5d00ffb1d8c90823b919171cef4 Mon Sep 17 00:00:00 2001 From: the5fire Date: Sun, 8 Apr 2018 20:55:44 +0800 Subject: [PATCH 30/97] =?UTF-8?q?=E6=94=B9=E9=80=A0=E4=B8=BAclass=20based?= =?UTF-8?q?=20view?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- typeidea/blog/views.py | 137 ++++++++++++--------- typeidea/typeidea/templates/blog/list.html | 14 +++ typeidea/typeidea/urls.py | 13 +- 3 files changed, 101 insertions(+), 63 deletions(-) diff --git a/typeidea/blog/views.py b/typeidea/blog/views.py index b469bb0..c967596 100644 --- a/typeidea/blog/views.py +++ b/typeidea/blog/views.py @@ -1,60 +1,81 @@ -from django.shortcuts import render +from django.views.generic import ListView, DetailView +from django.shortcuts import get_object_or_404 from config.models import SideBar -from .models import Post, Category - - -def post_list(request, category_id=None, tag_id=None): - tag = None - category = None - - if tag_id: - post_list, tag = Post.get_by_tag(tag_id) - elif category_id: - post_list, category = Post.get_by_category(category_id) - else: - post_list = Post.objects.filter(status=Post.STATUS_NORMAL)\ - .select_related('owner', 'category') - - context = { - 'category': category, - 'tag': tag, - 'post_list': post_list, - 'sidebars': get_sidebars(), - } - context.update(get_navs()) - return render(request, 'blog/list.html', context=context) - - -def post_detail(request, post_id=None): - try: - post = Post.objects.get(id=post_id) - except Post.DoesNotExist: - post = None - - context = { - 'post': post, - 'sidebars': get_sidebars(), - } - context.update(get_navs()) - return render(request, 'blog/detail.html', context=context) - - -def get_navs(): - categories = Category.objects.filter(status=Category.STATUS_NORMAL) - nav_categories = [] - normal_categories = [] - for cate in categories: - if cate.is_nav: - nav_categories.append(cate) - else: - normal_categories.append(cate) - - return { - 'navs': nav_categories, - 'categories': normal_categories, - } - - -def get_sidebars(): - return SideBar.objects.filter(status=SideBar.STATUS_SHOW) +from .models import Post, Category, Tag + + +class CommonViewMixin: + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({ + 'sidebars': self.get_sidebars(), + }) + context.update(self.get_navs()) + return context + + def get_sidebars(self): + return SideBar.objects.filter(status=SideBar.STATUS_SHOW) + + def get_navs(self): + categories = Category.objects.filter(status=Category.STATUS_NORMAL) + nav_categories = [] + normal_categories = [] + for cate in categories: + if cate.is_nav: + nav_categories.append(cate) + else: + normal_categories.append(cate) + + return { + 'navs': nav_categories, + 'categories': normal_categories, + } + + +class IndexView(CommonViewMixin, ListView): + queryset = Post.objects.filter(status=Post.STATUS_NORMAL) + paginate_by = 5 + context_object_name = 'post_list' + template_name = 'blog/list.html' + + +class CategoryView(IndexView): + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + category_id = self.kwargs.get('category_id') + category = get_object_or_404(Category, pk=category_id) + context.update({ + 'category': category, + }) + return context + + def get_queryset(self): + """ 重写querset,根据分类过滤 """ + queryset = super().get_queryset() + category_id = self.kwargs.get('category_id') + return queryset.filter(category_id=category_id) + + +class TagView(IndexView): + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + tag_id = self.kwargs.get('tag_id') + tag = get_object_or_404(Tag, pk=tag_id) + context.update({ + 'tag': tag, + }) + return context + + def get_queryset(self): + """ 重写querset,根据标签过滤 """ + queryset = super().get_queryset() + tag_id = self.kwargs.get('tag_id') + return queryset.filter(tag__id=tag_id) + + +class PostDetailView(CommonViewMixin, DetailView): + queryset = Post.objects.filter(status=Post.STATUS_NORMAL) + template_name = 'blog/detail.html' + context_object_name = 'post' + pk_url_kwarg = 'post_id' diff --git a/typeidea/typeidea/templates/blog/list.html b/typeidea/typeidea/templates/blog/list.html index a040466..e405732 100644 --- a/typeidea/typeidea/templates/blog/list.html +++ b/typeidea/typeidea/templates/blog/list.html @@ -5,6 +5,8 @@ 标签页: {{ tag.name }} {% elif category %} 分类页: {{ category.name }} + {% else %} + 首页 {% endif %} {% endblock %} @@ -22,4 +24,16 @@ {% endfor %} + {% if page_obj %} + + {% if page_obj.has_previous %} + 上一页 + {% endif %} + Page {{ page_obj.number }} of {{ paginator.num_pages }}. + {% if page_obj.has_next %} + 下一页 + {% endif %} + + {% endif %} + {% endblock %} diff --git a/typeidea/typeidea/urls.py b/typeidea/typeidea/urls.py index 75f2fd4..8e6bbf8 100644 --- a/typeidea/typeidea/urls.py +++ b/typeidea/typeidea/urls.py @@ -1,15 +1,18 @@ from django.conf.urls import url from django.contrib import admin -from blog.views import post_list, post_detail +from blog.views import ( + IndexView, CategoryView, TagView, + PostDetailView, +) from config.views import links from .custom_site import custom_site urlpatterns = [ - url(r'^$', post_list, name='index'), - url(r'^category/(?P\d+)/$', post_list, name='category-list'), - url(r'^tag/(?P\d+)/$', post_list, name='tag-list'), - url(r'^post/(?P\d+).html$', post_detail, name='post-detail'), + url(r'^$', IndexView.as_view(), name='index'), + url(r'^category/(?P\d+)/$', CategoryView.as_view(), name='category-list'), + url(r'^tag/(?P\d+)/$', TagView.as_view(), name='tag-list'), + url(r'^post/(?P\d+).html$', PostDetailView.as_view(), name='post-detail'), url(r'^links/$', links, name='links'), url(r'^super_admin/', admin.site.urls, name='super-admin'), url(r'^admin/', custom_site.urls, name='admin'), From 4b01adcbe789a94f4c74936433f3a6b64ca7457d Mon Sep 17 00:00:00 2001 From: the5fire Date: Sun, 8 Apr 2018 20:59:26 +0800 Subject: [PATCH 31/97] =?UTF-8?q?08-01=20=E9=9D=99=E6=80=81=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../typeidea/templates/static_page/demo.html | 28 +++++ .../typeidea/templates/static_page/list.html | 113 ++++++++++++++++++ 2 files changed, 141 insertions(+) create mode 100644 typeidea/typeidea/templates/static_page/demo.html create mode 100644 typeidea/typeidea/templates/static_page/list.html diff --git a/typeidea/typeidea/templates/static_page/demo.html b/typeidea/typeidea/templates/static_page/demo.html new file mode 100644 index 0000000..7dfeeff --- /dev/null +++ b/typeidea/typeidea/templates/static_page/demo.html @@ -0,0 +1,28 @@ + + + + Django实战开发-bootstrap demo + + + + +
+

Hello, world!

+
+
+
+
+
内容区
+
+
+
边栏区
+
+
+
+
+ 底部footer区域 +
+ + + + diff --git a/typeidea/typeidea/templates/static_page/list.html b/typeidea/typeidea/templates/static_page/list.html new file mode 100644 index 0000000..22c1dff --- /dev/null +++ b/typeidea/typeidea/templates/static_page/list.html @@ -0,0 +1,113 @@ + + + + Typeidea blog - by the5fire + + + + + + +
+ +
+

Typeidea

+

基于Django的多人博客系统

+
+
+
+
+
+
+
+
这里是标题
+ 作者:胡阳 + 分类:Python + 标签: + Python + Django + 经验 + +

Some quick example text to build on the card title and make up the bulk of the card's content.完整内容

+
+
+
+
+
这里是标题
+ 作者:胡阳 + 分类:Python + 标签: + Python + Django + 经验 + +

Some quick example text to build on the card title and make up the bulk of the card's content.完整内容

+
+
+
+
+
这里是标题
+ 作者:the5fire + 分类:Python + 标签: + Python + Django + 经验 + +

Some quick example text to build on the card title and make up the bulk of the card's content.完整内容

+
+
+ 上一页 + Page 1 of 1. + 下一页 +
+
+ +
+
+ + + + From 4de2e242886b6117571125f07f2438665abc4689 Mon Sep 17 00:00:00 2001 From: the5fire Date: Sun, 8 Apr 2018 21:59:58 +0800 Subject: [PATCH 32/97] =?UTF-8?q?=E5=A2=9E=E5=8A=A0themes=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- typeidea/typeidea/settings/base.py | 4 +++- .../typeidea/templates/{ => themes/default}/blog/base.html | 0 .../typeidea/templates/{ => themes/default}/blog/detail.html | 0 .../typeidea/templates/{ => themes/default}/blog/list.html | 0 .../{ => themes/default}/config/blocks/sidebar_comments.html | 0 .../{ => themes/default}/config/blocks/sidebar_posts.html | 0 .../typeidea/templates/{ => themes/default}/config/links.html | 0 7 files changed, 3 insertions(+), 1 deletion(-) rename typeidea/typeidea/templates/{ => themes/default}/blog/base.html (100%) rename typeidea/typeidea/templates/{ => themes/default}/blog/detail.html (100%) rename typeidea/typeidea/templates/{ => themes/default}/blog/list.html (100%) rename typeidea/typeidea/templates/{ => themes/default}/config/blocks/sidebar_comments.html (100%) rename typeidea/typeidea/templates/{ => themes/default}/config/blocks/sidebar_posts.html (100%) rename typeidea/typeidea/templates/{ => themes/default}/config/links.html (100%) diff --git a/typeidea/typeidea/settings/base.py b/typeidea/typeidea/settings/base.py index 34fd3ef..3958c39 100644 --- a/typeidea/typeidea/settings/base.py +++ b/typeidea/typeidea/settings/base.py @@ -56,10 +56,12 @@ ROOT_URLCONF = 'typeidea.urls' +THEME = 'default' + TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], + 'DIRS': [os.path.join(BASE_DIR, 'templates/themes', THEME)], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ diff --git a/typeidea/typeidea/templates/blog/base.html b/typeidea/typeidea/templates/themes/default/blog/base.html similarity index 100% rename from typeidea/typeidea/templates/blog/base.html rename to typeidea/typeidea/templates/themes/default/blog/base.html diff --git a/typeidea/typeidea/templates/blog/detail.html b/typeidea/typeidea/templates/themes/default/blog/detail.html similarity index 100% rename from typeidea/typeidea/templates/blog/detail.html rename to typeidea/typeidea/templates/themes/default/blog/detail.html diff --git a/typeidea/typeidea/templates/blog/list.html b/typeidea/typeidea/templates/themes/default/blog/list.html similarity index 100% rename from typeidea/typeidea/templates/blog/list.html rename to typeidea/typeidea/templates/themes/default/blog/list.html diff --git a/typeidea/typeidea/templates/config/blocks/sidebar_comments.html b/typeidea/typeidea/templates/themes/default/config/blocks/sidebar_comments.html similarity index 100% rename from typeidea/typeidea/templates/config/blocks/sidebar_comments.html rename to typeidea/typeidea/templates/themes/default/config/blocks/sidebar_comments.html diff --git a/typeidea/typeidea/templates/config/blocks/sidebar_posts.html b/typeidea/typeidea/templates/themes/default/config/blocks/sidebar_posts.html similarity index 100% rename from typeidea/typeidea/templates/config/blocks/sidebar_posts.html rename to typeidea/typeidea/templates/themes/default/config/blocks/sidebar_posts.html diff --git a/typeidea/typeidea/templates/config/links.html b/typeidea/typeidea/templates/themes/default/config/links.html similarity index 100% rename from typeidea/typeidea/templates/config/links.html rename to typeidea/typeidea/templates/themes/default/config/links.html From 02db6d563ae4448bae0fc6aca896873e65fc98dc Mon Sep 17 00:00:00 2001 From: the5fire Date: Sun, 8 Apr 2018 23:12:30 +0800 Subject: [PATCH 33/97] =?UTF-8?q?=E6=96=B0=E5=A2=9Ebootstrap=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- typeidea/typeidea/settings/base.py | 2 +- .../templates/themes/bootstrap/blog/base.html | 75 +++++++++++++++++++ .../themes/bootstrap/blog/detail.html | 17 +++++ .../templates/themes/bootstrap/blog/list.html | 42 +++++++++++ .../config/blocks/sidebar_comments.html | 5 ++ .../config/blocks/sidebar_posts.html | 5 ++ .../themes/bootstrap/config/links.html | 0 7 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 typeidea/typeidea/templates/themes/bootstrap/blog/base.html create mode 100644 typeidea/typeidea/templates/themes/bootstrap/blog/detail.html create mode 100644 typeidea/typeidea/templates/themes/bootstrap/blog/list.html create mode 100644 typeidea/typeidea/templates/themes/bootstrap/config/blocks/sidebar_comments.html create mode 100644 typeidea/typeidea/templates/themes/bootstrap/config/blocks/sidebar_posts.html create mode 100644 typeidea/typeidea/templates/themes/bootstrap/config/links.html diff --git a/typeidea/typeidea/settings/base.py b/typeidea/typeidea/settings/base.py index 3958c39..48af7df 100644 --- a/typeidea/typeidea/settings/base.py +++ b/typeidea/typeidea/settings/base.py @@ -56,7 +56,7 @@ ROOT_URLCONF = 'typeidea.urls' -THEME = 'default' +THEME = 'bootstrap' TEMPLATES = [ { diff --git a/typeidea/typeidea/templates/themes/bootstrap/blog/base.html b/typeidea/typeidea/templates/themes/bootstrap/blog/base.html new file mode 100644 index 0000000..c4bbe33 --- /dev/null +++ b/typeidea/typeidea/templates/themes/bootstrap/blog/base.html @@ -0,0 +1,75 @@ + + + + + {% block title %}首页{% endblock %}- typeidea博客系统 + + + + + +
+ +
+

Typeidea

+

基于Django的多人博客系统

+
+
+
+
+
+ {% block main %} + {% endblock %} +
+
+ {% block sidebar %} + {% for sidebar in sidebars %} + + {% endfor %} + {% endblock %} +
+
+
+ +
+ {% block footer %} +
+
+ +
+
+ Power by Typeidea@the5fire +
+ {% endblock %} +
+ diff --git a/typeidea/typeidea/templates/themes/bootstrap/blog/detail.html b/typeidea/typeidea/templates/themes/bootstrap/blog/detail.html new file mode 100644 index 0000000..c4278e7 --- /dev/null +++ b/typeidea/typeidea/templates/themes/bootstrap/blog/detail.html @@ -0,0 +1,17 @@ +{% extends "./base.html" %} +{% block title %} {{ post.title }} {% endblock %} + +{% block main %} + {% if post %} +

{{ post.title }}

+
+ 分类:{{ post.category.name }} + 作者:{{ post.owner.username }} + 创建时间:{{ post.created_time }} +
+
+

+ {{ post.content }} +

+ {% endif %} +{% endblock %} diff --git a/typeidea/typeidea/templates/themes/bootstrap/blog/list.html b/typeidea/typeidea/templates/themes/bootstrap/blog/list.html new file mode 100644 index 0000000..24e522a --- /dev/null +++ b/typeidea/typeidea/templates/themes/bootstrap/blog/list.html @@ -0,0 +1,42 @@ +{% extends "./base.html" %} + +{% block title %} + {% if tag %} + 标签页: {{ tag.name }} + {% elif category %} + 分类页: {{ category.name }} + {% else %} + 首页 + {% endif %} +{% endblock %} + + +{% block main %} + {% for post in post_list %} +
+
+
{{ post.title }}
+ 作者:{{ post.owner.username }} + 分类:{{ post.category.name }} + 标签: + {% for tag in post.tags %} + {{ tag.name }} + {% endfor %} + +
+

{{ post.desc }}完整内容

+
+
+ {% endfor %} + + {% if page_obj %} + {% if page_obj.has_previous %} + 上一页 + {% endif %} + Page {{ page_obj.number }} of {{ paginator.num_pages }}. + {% if page_obj.has_next %} + 下一页 + {% endif %} + {% endif %} + +{% endblock %} diff --git a/typeidea/typeidea/templates/themes/bootstrap/config/blocks/sidebar_comments.html b/typeidea/typeidea/templates/themes/bootstrap/config/blocks/sidebar_comments.html new file mode 100644 index 0000000..30238c1 --- /dev/null +++ b/typeidea/typeidea/templates/themes/bootstrap/config/blocks/sidebar_comments.html @@ -0,0 +1,5 @@ + diff --git a/typeidea/typeidea/templates/themes/bootstrap/config/blocks/sidebar_posts.html b/typeidea/typeidea/templates/themes/bootstrap/config/blocks/sidebar_posts.html new file mode 100644 index 0000000..d933d46 --- /dev/null +++ b/typeidea/typeidea/templates/themes/bootstrap/config/blocks/sidebar_posts.html @@ -0,0 +1,5 @@ + diff --git a/typeidea/typeidea/templates/themes/bootstrap/config/links.html b/typeidea/typeidea/templates/themes/bootstrap/config/links.html new file mode 100644 index 0000000..e69de29 From 1828e93f344698f516d7e46786660980d739cacd Mon Sep 17 00:00:00 2001 From: the5fire Date: Sun, 8 Apr 2018 23:26:03 +0800 Subject: [PATCH 34/97] =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E9=9D=99=E6=80=81=E8=B5=84=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- typeidea/typeidea/settings/base.py | 3 +++ .../typeidea/templates/themes/bootstrap/blog/base.html | 3 ++- .../templates/themes/bootstrap/static/css/bootstrap.css | 7 +++++++ .../themes/bootstrap/static/css/bootstrap.min.css | 7 +++++++ 4 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 typeidea/typeidea/templates/themes/bootstrap/static/css/bootstrap.css create mode 100644 typeidea/typeidea/templates/themes/bootstrap/static/css/bootstrap.min.css diff --git a/typeidea/typeidea/settings/base.py b/typeidea/typeidea/settings/base.py index 48af7df..4671532 100644 --- a/typeidea/typeidea/settings/base.py +++ b/typeidea/typeidea/settings/base.py @@ -125,3 +125,6 @@ # https://docs.djangoproject.com/en/1.11/howto/static-files/ STATIC_URL = '/static/' +STATICFILES_DIRS = [ + os.path.join(BASE_DIR, 'templates/themes', THEME, "static"), +] diff --git a/typeidea/typeidea/templates/themes/bootstrap/blog/base.html b/typeidea/typeidea/templates/themes/bootstrap/blog/base.html index c4bbe33..be29323 100644 --- a/typeidea/typeidea/templates/themes/bootstrap/blog/base.html +++ b/typeidea/typeidea/templates/themes/bootstrap/blog/base.html @@ -1,10 +1,11 @@ +{% load static %} {% block title %}首页{% endblock %}- typeidea博客系统 - + + + +
+ {% if succeed %} + 评论成功! + 返回 + {% else %} +
    + {% for field, message in form.errors.items %} +
  • {{ message }}
  • + {% endfor %} +
+ 返回 + {% endif %} +
+ + diff --git a/typeidea/typeidea/urls.py b/typeidea/typeidea/urls.py index c82b56b..f386751 100644 --- a/typeidea/typeidea/urls.py +++ b/typeidea/typeidea/urls.py @@ -6,6 +6,7 @@ PostDetailView, SearchView, AuthorView ) from config.views import LinkListView +from comment.views import CommentView from .custom_site import custom_site urlpatterns = [ @@ -13,6 +14,7 @@ url(r'^category/(?P\d+)/$', CategoryView.as_view(), name='category-list'), url(r'^tag/(?P\d+)/$', TagView.as_view(), name='tag-list'), url(r'^search/$', SearchView.as_view(), name='search'), + url(r'^comment/$', CommentView.as_view(), name='comment'), url(r'^author/(?P\d+)/$', AuthorView.as_view(), name='author'), url(r'^post/(?P\d+).html$', PostDetailView.as_view(), name='post-detail'), url(r'^links/$', LinkListView.as_view(), name='links'), From 1876ba8c7b049621189de9b210d2b8c385cecf8c Mon Sep 17 00:00:00 2001 From: the5fire Date: Tue, 10 Apr 2018 20:59:28 +0800 Subject: [PATCH 38/97] =?UTF-8?q?=E6=8A=BD=E8=B1=A1=E8=AF=84=E8=AE=BA?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E4=B8=BA=E7=8B=AC=E7=AB=8B=E7=9A=84tag?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- typeidea/blog/views.py | 10 -------- typeidea/comment/templatetags/__init__.py | 0 .../comment/templatetags/comment_block.py | 15 ++++++++++++ .../themes/bootstrap/blog/detail.html | 24 ++----------------- .../themes/bootstrap/comment/block.html | 23 ++++++++++++++++++ .../themes/bootstrap/config/links.html | 2 ++ 6 files changed, 42 insertions(+), 32 deletions(-) create mode 100644 typeidea/comment/templatetags/__init__.py create mode 100644 typeidea/comment/templatetags/comment_block.py create mode 100644 typeidea/typeidea/templates/themes/bootstrap/comment/block.html diff --git a/typeidea/blog/views.py b/typeidea/blog/views.py index 9113be7..be4f0d5 100644 --- a/typeidea/blog/views.py +++ b/typeidea/blog/views.py @@ -2,8 +2,6 @@ from django.views.generic import ListView, DetailView from django.shortcuts import get_object_or_404 -from comment.forms import CommentForm -from comment.models import Comment from config.models import SideBar from .models import Post, Category, Tag @@ -83,14 +81,6 @@ class PostDetailView(CommonViewMixin, DetailView): context_object_name = 'post' pk_url_kwarg = 'post_id' - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - context.update({ - 'comment_form': CommentForm, - 'comment_list': Comment.get_by_target(self.request.path), - }) - return context - class SearchView(IndexView): def get_context_data(self): diff --git a/typeidea/comment/templatetags/__init__.py b/typeidea/comment/templatetags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/typeidea/comment/templatetags/comment_block.py b/typeidea/comment/templatetags/comment_block.py new file mode 100644 index 0000000..08d052f --- /dev/null +++ b/typeidea/comment/templatetags/comment_block.py @@ -0,0 +1,15 @@ +from django import template + +from comment.forms import CommentForm +from comment.models import Comment + +register = template.Library() + + +@register.inclusion_tag('comment/block.html') +def comment_block(target): + return { + 'target': target, + 'comment_form': CommentForm, + 'comment_list': Comment.get_by_target(target), + } diff --git a/typeidea/typeidea/templates/themes/bootstrap/blog/detail.html b/typeidea/typeidea/templates/themes/bootstrap/blog/detail.html index 9ae9b94..689a2ba 100644 --- a/typeidea/typeidea/templates/themes/bootstrap/blog/detail.html +++ b/typeidea/typeidea/templates/themes/bootstrap/blog/detail.html @@ -1,4 +1,5 @@ {% extends "./base.html" %} +{% load comment_block %} {% block title %} {{ post.title }} {% endblock %} {% block main %} @@ -14,27 +15,6 @@

{{ post.title }}

{{ post.content }}

{% endif %} -
-
-
- {% csrf_token %} - - {{ comment_form }} - -
- -
    - {% for comment in comment_list %} -
  • -
    - {{ comment.nickname }} {{ comment.created_time }} -
    -
    - {{ comment.content }} -
    -
  • - {% endfor %} -
-
+ {% comment_block request.path %} {% endblock %} diff --git a/typeidea/typeidea/templates/themes/bootstrap/comment/block.html b/typeidea/typeidea/templates/themes/bootstrap/comment/block.html new file mode 100644 index 0000000..ac6daaa --- /dev/null +++ b/typeidea/typeidea/templates/themes/bootstrap/comment/block.html @@ -0,0 +1,23 @@ +
+
+
+ {% csrf_token %} + + {{ comment_form }} + +
+ + +
    + {% for comment in comment_list %} +
  • +
    + {{ comment.nickname }} {{ comment.created_time }} +
    +
    + {{ comment.content }} +
    +
  • + {% endfor %} +
+
diff --git a/typeidea/typeidea/templates/themes/bootstrap/config/links.html b/typeidea/typeidea/templates/themes/bootstrap/config/links.html index 8a47d43..d5b81c0 100644 --- a/typeidea/typeidea/templates/themes/bootstrap/config/links.html +++ b/typeidea/typeidea/templates/themes/bootstrap/config/links.html @@ -1,4 +1,5 @@ {% extends "blog/base.html" %} +{% load comment_block %} {% block title %}友情链接{% endblock %} {% block main %} @@ -20,4 +21,5 @@ {% endfor %} +{% comment_block request.path %} {% endblock %} From acc3d04a115cd9a4a0e94eb0a40c4a10060bfdb3 Mon Sep 17 00:00:00 2001 From: the5fire Date: Wed, 11 Apr 2018 19:28:29 +0800 Subject: [PATCH 39/97] =?UTF-8?q?=E9=85=8D=E7=BD=AEmarkdown=E5=92=8C?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E9=AB=98=E4=BA=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blog/migrations/0004_post_content_html.py | 20 +++++++++++++++++++ typeidea/blog/models.py | 8 ++++++++ typeidea/comment/forms.py | 3 +++ .../templates/themes/bootstrap/blog/base.html | 7 +++++++ .../themes/bootstrap/blog/detail.html | 10 +++++++++- .../themes/bootstrap/comment/block.html | 2 ++ 6 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 typeidea/blog/migrations/0004_post_content_html.py diff --git a/typeidea/blog/migrations/0004_post_content_html.py b/typeidea/blog/migrations/0004_post_content_html.py new file mode 100644 index 0000000..313c899 --- /dev/null +++ b/typeidea/blog/migrations/0004_post_content_html.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.11 on 2018-04-10 15:10 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0003_auto_20180325_1737'), + ] + + operations = [ + migrations.AddField( + model_name='post', + name='content_html', + field=models.TextField(blank=True, editable=False, verbose_name='正文html代码'), + ), + ] diff --git a/typeidea/blog/models.py b/typeidea/blog/models.py index 64891f8..f63a5c7 100644 --- a/typeidea/blog/models.py +++ b/typeidea/blog/models.py @@ -1,6 +1,8 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals +import mistune + from django.contrib.auth.models import User from django.db import models @@ -59,6 +61,7 @@ class Post(models.Model): title = models.CharField(max_length=255, verbose_name="标题") desc = models.CharField(max_length=1024, blank=True, verbose_name="摘要") content = models.TextField(verbose_name="正文", help_text="正文必须为MarkDown格式") + content_html = models.TextField(verbose_name="正文html代码", blank=True, editable=False) status = models.PositiveIntegerField(default=STATUS_NORMAL, choices=STATUS_ITEMS, verbose_name="状态") category = models.ForeignKey(Category, verbose_name="分类") tag = models.ManyToManyField(Tag, verbose_name="标签") @@ -70,10 +73,15 @@ class Post(models.Model): class Meta: verbose_name = verbose_name_plural = "文章" + ordering = ['-id'] def __str__(self): return self.title + def save(self, *args, **kwargs): + self.content_html = mistune.markdown(self.content) + super().save(*args, **kwargs) + @staticmethod def get_by_tag(tag_id): try: diff --git a/typeidea/comment/forms.py b/typeidea/comment/forms.py index b6bf601..6e35b00 100644 --- a/typeidea/comment/forms.py +++ b/typeidea/comment/forms.py @@ -1,3 +1,5 @@ +import markdown + from django import forms from .models import Comment @@ -38,6 +40,7 @@ def clean_content(self): content = self.cleaned_data.get('content') if len(content) < 10: raise forms.ValidationError('内容长度怎么能这么短呢!!') + content = markdown.markdown(content) return content class Meta: diff --git a/typeidea/typeidea/templates/themes/bootstrap/blog/base.html b/typeidea/typeidea/templates/themes/bootstrap/blog/base.html index c7a003c..54219d6 100644 --- a/typeidea/typeidea/templates/themes/bootstrap/blog/base.html +++ b/typeidea/typeidea/templates/themes/bootstrap/blog/base.html @@ -6,6 +6,13 @@ {% block title %}首页{% endblock %}- typeidea博客系统 + + {% block extra_head %} + {% endblock %} + + + +