diff --git a/typeidea/.vscode/settings.json b/typeidea/.vscode/settings.json new file mode 100644 index 0000000..5e18a25 --- /dev/null +++ b/typeidea/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "python.pythonPath": "F:\\DjangoProject\\env\\python.exe" +} \ No newline at end of file diff --git a/typeidea/comment/admin.py b/typeidea/comment/admin.py index 7179dc7..3722e92 100644 --- a/typeidea/comment/admin.py +++ b/typeidea/comment/admin.py @@ -1,12 +1,44 @@ -# -*- 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 .models import Comment -from typeidea.custom_site import custom_site - +from .adminform import CommentAdminForms +from typeidea.custom_site import comment_admin_site +from typeidea.custom_admin import BaseOwnerAdmin -@admin.register(Comment, site=custom_site) +@admin.register(Comment, site=comment_admin_site) class CommentAdmin(admin.ModelAdmin): - list_display = ('target', 'nickname', 'content', 'website', 'created_time') + # 展示页面定制 + list_display = [ + 'post', 'content', 'nickname_show', + 'email', 'created_time', 'open_comment_website' + ] + list_filter = ['nickname', 'post', 'created_time'] + search_fields = ['nickname', 'post'] + + date_hierarchy = 'created_time' + + # 编辑页面定制 + form = CommentAdminForms + save_on_top = False + save_on_bottom = True + fields = ( + ('post', 'nickname'), + 'email', + 'content', 'websit' + ) + + + def open_comment_website(self, obj): + return format_html( + '跳转至评论页', + reverse('comment_amdin:comment_comment_change', args=(obj.id,)) + ) + open_comment_website.short_description = '评论页' + + +class CommentInlineAdmin(admin.TabularInline): + fields = ('nickname','content') + extra = 1 + model = Comment diff --git a/typeidea/comment/adminform.py b/typeidea/comment/adminform.py new file mode 100644 index 0000000..2918791 --- /dev/null +++ b/typeidea/comment/adminform.py @@ -0,0 +1,5 @@ +from django import forms + + +class CommentAdminForms(forms.ModelForm): + content = forms.CharField(widget=forms.Textarea, label='内容', required=False) \ No newline at end of file diff --git a/typeidea/comment/models.py b/typeidea/comment/models.py index 407b8b9..a50b91f 100644 --- a/typeidea/comment/models.py +++ b/typeidea/comment/models.py @@ -1,25 +1,24 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - from django.db import models +from django.contrib.auth.models import User 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="创建时间") + post = models.ForeignKey(Post, on_delete=models.CASCADE, verbose_name='文章') + content = models.CharField(max_length=2000, verbose_name='内容') + nickname = models.CharField(max_length=50, verbose_name='别名') + websit = models.URLField(verbose_name='网址') + email = models.EmailField(verbose_name='邮箱') + created_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') + + class Meta(): + verbose_name = verbose_name_plural = '评论' + + def __str__(self): + return '{}'.format(self.post.title) + + def nickname_show(self): + return '来自{}的评论'.format(self.nickname) + nickname_show.short_description = '评论者' - class Meta: - verbose_name = verbose_name_plural = "评论" diff --git a/typeidea/config/admin.py b/typeidea/config/admin.py index b5bfde4..04a860a 100644 --- a/typeidea/config/admin.py +++ b/typeidea/config/admin.py @@ -1,28 +1,56 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - from django.contrib import admin +from django.utils.html import format_html +from django.urls import reverse from .models import Link, SideBar -from typeidea.custom_site import custom_site -from typeidea.base_admin import BaseOwnerAdmin +from config.adminform import ConfigLinkAdminForm, ConfigSideBarAdminForm +from typeidea.custom_admin import BaseOwnerAdmin +from typeidea.custom_site import config_admin_site -@admin.register(Link, site=custom_site) +@admin.register(Link, site=config_admin_site) class LinkAdmin(BaseOwnerAdmin): - 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, site=custom_site) + # 展示页面定制 + list_display = [ + 'title', 'href', 'weight', 'create_time', 'status_show', 'goahead_link' + ] + list_filter = ['title', 'create_time', 'weight'] + search_fields = ['title', 'weight'] + + date_hierarchy = 'create_time' + + # 编辑页面定制 + form = ConfigLinkAdminForm + save_on_top = False + save_on_bottom = True + fields = ( + 'title', 'weight', 'status', 'href' + ) + + def goahead_link(self, obj): + return format_html( + '编辑', + reverse('config_admin:config_link_change', args=(obj.id,)) + ) + goahead_link.short_description = '链接' + + +@admin.register(SideBar, site=config_admin_site) class SideBarAdmin(BaseOwnerAdmin): - 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) + # 展示页面定制 + list_display = [ + 'title', 'display_type', 'content', 'created_time', 'status_show' + ] + list_filter = ['title', 'created_time', 'display_type'] + search_fields = ['title', 'display_type', 'status'] + + date_hierarchy = 'created_time' + + # 定义编辑页面 + form = ConfigSideBarAdminForm + save_on_top = False + save_on_bottom = True + + fields = ( + 'title', 'display_type', 'content', 'status' + ) diff --git a/typeidea/config/adminform.py b/typeidea/config/adminform.py new file mode 100644 index 0000000..47f04f5 --- /dev/null +++ b/typeidea/config/adminform.py @@ -0,0 +1,11 @@ +from django import forms + + +class ConfigSideBarAdminForm(forms.ModelForm): + # status = forms.BooleanField(label='是否下线', required=False) + pass + + +class ConfigLinkAdminForm(forms.ModelForm): + # status = forms.BooleanField(label='是否下线', required=False) + pass \ No newline at end of file diff --git a/typeidea/config/models.py b/typeidea/config/models.py index b3efdce..4c1c7bd 100644 --- a/typeidea/config/models.py +++ b/typeidea/config/models.py @@ -1,41 +1,39 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.contrib.auth.models import User from django.db import models +from django.contrib.auth.models import User class Link(models.Model): - STATUS_NORMAL = 1 - STATUS_DELETE = 0 - STATUS_ITEMS = ( - (STATUS_NORMAL, '正常'), - (STATUS_DELETE, '删除'), + STATUS_ITEM = ( + (1, '正常'), + (2, '删除'), ) - 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="状态") + title = models.CharField(max_length=50, verbose_name='标题') + href = models.URLField(verbose_name='链接') + status = models.PositiveIntegerField(default=1, choices=STATUS_ITEM, 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="创建时间") + verbose_name='权重', + help_text='权重越高展示顺序越靠前') + + owner = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='作者') + create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') - class Meta: - verbose_name = verbose_name_plural = "友链" + class Meta(): + verbose_name = verbose_name_plural = '友链' def __str__(self): return self.title + def status_show(self): + return '当前状态{}'.format(self.status) + status_show.short_description = '状态' + class SideBar(models.Model): - STATUS_SHOW = 1 - STATUS_HIDE = 0 - STATUS_ITEMS = ( - (STATUS_SHOW, '展示'), - (STATUS_HIDE, '隐藏'), + STATUS_ITEM = ( + (1, '正常'), + (2, '下线') ) + SIDE_TYPE = ( (1, 'HTML'), (2, '最新文章'), @@ -43,17 +41,21 @@ class SideBar(models.Model): (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 = "侧边栏" - + 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=1, choices=STATUS_ITEM, verbose_name='状态') + + owner = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='作者') + created_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') + + class Meta(): + verbose_name = verbose_name_plural = '侧边栏' + + def status_show(self): + return '当前状态{}'.format(self.status) + status_show.short_description = '状态' + def __str__(self): - return self.title + return self.title \ No newline at end of file diff --git a/typeidea/typeidea/base_admin.py b/typeidea/typeidea/custom_admin.py similarity index 63% rename from typeidea/typeidea/base_admin.py rename to typeidea/typeidea/custom_admin.py index deacd8e..4e36189 100644 --- a/typeidea/typeidea/base_admin.py +++ b/typeidea/typeidea/custom_admin.py @@ -2,16 +2,10 @@ 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) + return super(BaseOwnerAdmin, self).save_model(request, obj, form, change) \ No newline at end of file diff --git a/typeidea/typeidea/custom_site.py b/typeidea/typeidea/custom_site.py index 83a2f99..7802352 100644 --- a/typeidea/typeidea/custom_site.py +++ b/typeidea/typeidea/custom_site.py @@ -1,10 +1,24 @@ from django.contrib.admin import AdminSite -class CustomSite(AdminSite): - site_header = 'Typeidea' - site_title = 'Typeidea管理后台' +class PostAdminSite(AdminSite): + site_header = '文章管理' + site_title = '文章管理后台' index_title = '首页' -custom_site = CustomSite(name='cus_admin') +class CommentAdminSite(AdminSite): + site_header = '评论管理' + site_title = '评论管理后台' + index_title = '首页' + + +class ConfigAdminSite(AdminSite): + site_header = '配置管理' + site_title = '配置管理后台' + index_title = '首页' + + +post_admin_site = PostAdminSite(name='post_admin') +comment_admin_site = CommentAdminSite(name='comment_amdin') +config_admin_site = ConfigAdminSite(name='config_admin') \ No newline at end of file diff --git a/typeidea/typeidea/urls.py b/typeidea/typeidea/urls.py index c39504f..04fe263 100644 --- a/typeidea/typeidea/urls.py +++ b/typeidea/typeidea/urls.py @@ -1,9 +1,26 @@ -from django.conf.urls import url +"""typeidea URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/2.2/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" from django.contrib import admin +from django.urls import path +from .custom_site import post_admin_site, comment_admin_site, config_admin_site -from .custom_site import custom_site urlpatterns = [ - url(r'^super_admin/', admin.site.urls), - url(r'^admin/', custom_site.urls), + path('admin/', admin.site.urls), + path('post_admin/', post_admin_site.urls), + path('comment_admin/', comment_admin_site.urls), + path('config_admin/', config_admin_site.urls) ]