一、新闻标签管理功能
1. 新闻标签列表
1.1 视图
class TagListView(MyPermissionRequiredMixin, MyListView):
permission_required = ('myadmin.news_tag_list',)
model = Tag
page_header = '系统设置'
page_option = '新闻标签管理'
table_title = '新闻标签列表'
fields = ['name', 'is_delete']
1.2 模板
myadmin/tag/tag_list.html
{% extends 'myadmin/base/obj_list.html' %}
{% block add_button %}
<button type="button" class="btn btn-primary btn-sm"
data-url="{% url 'myadmin:news_tag_add' %}">添加
</button>
{% endblock %}
{% block table_content %}
<tr>
<th>#</th>
<th>标签名</th>
<th>是否可用</th>
</tr>
{% for obj in page_obj %}
<tr>
<td style="width: 40px" data-url="{% url 'myadmin:update_tag' obj.id %}"><a
href="#">{{ forloop.counter }}</a></td>
<td>{{ obj.name }}</td>
<td>{% if obj.is_delete %}否{% else %}是{% endif %}</td>
</tr>
{% endfor %}
{% endblock %}
1.3路由
path('tags/', views.TagListView.as_view(), name='tag_list'),
2.新闻标签更新
2.1 视图
class TagUpdateView(MyPermissionRequiredMixin, UpdateView):
permission_required = ('myadmin:news_tag_update', )
model = Tag
template_name = 'myadmin/tag/tag_detail.html'
page_header = '系统设置'
page_option = '新闻标签管理'
table_title = '新闻标签修改'
fields = ['name', 'is_delete']
2.2 模板
myadmin/tag/tag_detail.html
{% extends 'myadmin/base/obj_detail.html' %}
{% block update_url %}{% url 'myadmin:news_tag_update' form.instance.id %}{% endblock %}
{% block add_url %}{% url 'myadmin:news_tag_add' %}{% endblock %}
2.3 路由
path('tag/<int:pk>/', views.TagUpdateView.as_view(), name='news_tag_update'),
3.添加新闻标签
3.1 视图
class TagAddView(MyPermissionRequiredMixin, AddView):
permission_required = ('myadmin.news_tag_add')
model = Tag
page_header = '系统设置'
page_option = '新闻标签管理'
table_title = '新闻标签添加'
fields = ['name', 'is_delete']
3.2 模板
同更新模板
3.3 路由
path('tag/', views.TagAddView.as_view(), name='add_tag')
二、热门新闻管理功能
1.热门新闻列表
1.1 视图
class HotNewsListView(MyPermissionRequiredMixin, MyListView):
permission_required = ('myadmin.hotnews_list',)
model = HotNews
page_header = '新闻管理'
page_option = '热门新闻管理'
table_title = '热门新闻列表'
fields = ['news__title', 'news__tag__name', 'priority', 'is_delete']
is_paginate = True
per_page = 10
def get_queryset(self):
queryset = super().get_queryset()
return queryset.select_related('news__tag').order_by('-priority')
1.2 模板
<!-- hotnews_list.html -->
{% extends 'myadmin/base/obj_list.html' %}
{% block search_form %}
{% endblock %}
{% block add_button %}
<button type="button" class="btn btn-primary btn-sm"
data-url="{% url 'myadmin:hotnews_add' %}">添加
</button>
{% endblock %}
{% block table_content %}
<tr>
<th>#</th>
<th>标题</th>
<th>类别</th>
<th>优先级</th>
<th>逻辑删除</th>
</tr>
{% for obj in page_obj %}
<tr>
<td style="width: 40px" data-url="{% url 'myadmin:hotnews_update' obj.id %}"><a
href="#">{{ forloop.counter }}</a></td>
<td>{{ obj.news.title }}</td>
<td>{{ obj.news.tag.name }}</td>
<td>{{ obj.priority }}</td>
<td>{% if obj.is_delete %}是{% else %}否{% endif %}</td>
</tr>
{% endfor %}
{% endblock %}
1.3 路由
path('hotnewses/', views.HotNewsListView.as_view(), name='hotnews_list'),
2.热门新闻更新
2.1 视图
class HotNewsUpdateView(MyPermissionRequiredMixin, UpdateView):
permission_required = ('myadmin.hotnews_update',)
model = HotNews
page_header = '新闻管理'
page_option = '热门新闻管理'
table_title = '热门新闻更新'
fields = ['priority', 'is_delete']
2.2 模板
<!-- hotnews_detail.html -->
{% extends 'myadmin/base/obj_detail.html' %}
{% block update_url %}{% url 'myadmin:hotnews_update' form.instance.id %}{% endblock %}
{% block add_url %}{% url 'myadmin:hotnews_add' %}{% endblock %}
2.3 路由
path('hotnews/<int:pk>/', views.HotNewsUpdateView.as_view(), name='hotnews_update'),
3.热门新闻添加
3.1 视图
class HotNewsAddView(MyPermissionRequiredMixin, AddView):
permission_required = ('myadmin.hotnews_add',)
model = HotNews
page_header = '新闻管理'
page_option = '热门新闻管理'
table_title = '热门新闻添加'
fields = ['news', 'priority']
3.2 模板
同更新模板
3.3 路由
path('hotnews/', views.HotNewsAddView.as_view(), name='hotnews_add')
三、轮播图管理功能
1. 轮播图列表
1.1 视图
class NewsBannerListView(MyPermissionRequiredMixin, MyListView):
permission_required = ('myadmin.banner_list',)
model = Banner
page_header = '新闻管理'
page_option = '轮播图管理'
table_title = '轮播图列表'
fields = ['image_url', 'priority', 'news__title', 'news__tag__name', 'is_delete']
def get_queryset(self):
queryset = super().get_queryset()
return queryset.select_related('news__tag').order_by('-priority')
1.2 模板
<!-- myadmin/banner/banner_list.html -->
{% extends 'myadmin/base/obj_list.html' %}
{% block add_button %}
<button type="button" class="btn btn-primary btn-sm"
data-url="{% url 'myadmin:banner_add' %}">添加
</button>
{% endblock %}
{% block table_content %}
<tr>
<th>#</th>
<th>图片</th>
<th>新闻标题</th>
<th>新闻类别</th>
<th>优先级</th>
<th>逻辑删除</th>
</tr>
{% for obj in page_obj %}
<tr>
<td style="width: 40px" data-url="{% url 'myadmin:banner_update' obj.id %}"><a
href="#">{{ forloop.counter }}</a></td>
<td style="width: 100px"><img src="{{ obj.image_url }}" alt="" style="width: 80px;height: 40px"></td>
<td>{{ obj.news.title }}</td>
<td>{{ obj.news.tag }}</td>
<td>{{ obj.priority }}</td>
<td>{% if obj.is_delete %}是{% else %}否{% endif %}</td>
</tr>
{% endfor %}
{% endblock %}
1.3 路由
path('banners/', views.NewsBannerListView.as_view(), name='banner_list'),
2. 录播图更新
2.1 视图
class NewsBannerUpdateView(MyPermissionRequiredMixin, UpdateView):
permission_required = ('myadmin.news_banner_update', )
model = Banner
page_header = '新闻管理'
page_option = '轮播图管理'
table_title = '轮播图更新'
fields = ['image_url', 'priority', 'news', 'is_delete']
注意修改模型中的image_url字段的类型与新闻模型中的字段一致。
2.2 模板
{% extends 'myadmin/base/obj_detail.html' %}
{% block update_url %}{% url 'myadmin:banner_update' form.instance.id %}{% endblock %}
{% block add_url %}{% url 'myadmin:banner_add' %}{% endblock %}
2.3 路由
path('banner/<int:pk>/', views.NewsBannerUpdateView.as_view(), name='banner_update'),
3. 轮播图添加
3.1 视图
class NewsBannerAddView(MyPermissionRequiredMixin, AddView):
permission_required = ('myadmin.news_banner_add', )
model = Banner
page_header = '新闻管理'
page_option = '轮播图管理'
table_title = '轮播图添加'
fields = ['image_url', 'priority', 'news', 'is_delete']
3.2模板
模板同更新视图
3.3 路由
path('banner/', views.NewsBannerAddView.as_view(), name='banner_add'),
四、文档管理
1.文档列表
1.1 视图
class DocListView(MyPermissionRequiredMixin, MyListView):
permission_required = ('myadmin.doc_list', )
model = Doc
page_header = '文档管理'
page_option = '文档管理'
table_title = '文档列表'
fields = ['title', 'file_name', 'desc', 'file_url', 'image_url', 'author__username', 'is_delete']
def get_queryset(self):
queryset = super().get_queryset()
return queryset.select_related('author')
1.2 模板
{% extends 'admin/base/obj_list.html' %}
{% block add_button %}
<button type="button" class="btn btn-primary btn-sm"
data-url="{% url 'myadmin:doc_add' %}">添加
</button>
{% endblock %}
{% block table_content %}
<tr>
<th>#</th>
<th>标题</th>
<th>文件名</th>
<th>简介</th>
<th>图片</th>
<th>作者</th>
<th>文件地址</th>
<th>逻辑删除</th>
</tr>
{% for obj in page_obj %}
<tr>
<td style="width: 40px" data-url="{% urlmyadmin:n:doc_update' obj.id %}"><a
href="#">{{ forloop.counter }}</a></td>
<td>{{ obj.title }}</td>
<td>{{ obj.file_name }}</td>
<td style="width: 200px">{{ obj.desc }}</td>
<td><img src="{{ obj.image_url }}" alt="" style="width: 80px;height: 20px"></td>
<td>{{ obj.author.username }}</td>
<td>{{ obj.file_url }}</td>
<td>{% if obj.is_delete %}是{% else %}否{% endif %}</td>
</tr>
{% endfor %}
{% endblock %}
1.3 路由
path('docs/', views.DocListView.as_view(), name='doc_list'),
2.文档更新
2.1 视图
class DocUpdateView(MyPermissionRequiredMixin, UpdateView):
permission_required = ('myadmin.doc_update',)
model = Doc
page_header = '文档管理'
page_option = '文档管理'
table_title = '文档更新'
fields = ['title', 'file_name', 'desc', 'file_url', 'image_url', 'author', 'is_delete']
2.2 模板
{% extends 'admin/base/obj_detail.html' %}
{% block update_url %}
{% url 'myadmin:doc_update' form.instance.id %}
{% endblock %}
{% block add_url %}
{% urlmyadmin:n:doc_add' %}
{% endblock %}
2.3 路由
path('doc/<int:pk>/', views.DocUpdateView.as_view(), name='doc_update'),
3.文档添加
3.1 视图
class DocAddView(MyPermissionRequiredMixin, AddView):
permission_required = ('myadmin.doc_add', )
model = Doc
page_header = '文档管理'
page_option = '文档管理'
table_title = '文档添加'
fields = ['title', 'file_name', 'desc', 'file_url', 'image_url', 'is_delete']
def save(self, form):
instance = form.save(commit=False)
instance.author = self.request.user
instance.save()
# TODO 文档还没写
3.2 模板
同文档更新
3.3 路由
path('doc/', views.DocAddView.as_view(), name='doc_add'),
五、课程管理
1. 课程列表
1.1 视图
class CourseListView(MyPermissionRequiredMixin, MyListView):
permission_required = ('myadmin.course_list', )
model = Course
page_header = '在线课堂'
page_option = '课程管理'
table_title = '课程列表'
fields = ['title', 'category__name', 'teacher__name', 'profile', 'outline', 'duration', 'cover_url', 'is_delete']
1.2 模板
{% extends 'admin/base/obj_list.html' %}
{% block search_form %}
{% endblock %}
{% block add_button %}
<button type="button" class="btn btn-primary btn-sm"
data-url="{% url 'myadmin:course_add' %}">添加
</button>
{% endblock %}
{% block table_content %}
<tr>
<th>#</th>
<th>标题</th>
<th>类型</th>
<th>老师</th>
<th>简介</th>
<th>大纲</th>
<th>时长</th>
<th>封面</th>
<th>逻辑删除</th>
</tr>
{% for obj in page_obj %}
<tr>
<td style="width: 40px" data-url="{% urlmyadmin:n:course_update' obj.id %}"><a href="#">{{ forloop.counter }}</a></td>
<td>{{ obj.title }}</td>
<td>{{ obj.category.name }}</td>
<td>{{ obj.teacher.name }}</td>
<td>{{ obj.profile|default:'无' }}</td>
<td>{{ obj.outline|default:'无' }}</td>
<td>{{ obj.duration }}</td>
<td><img src="{{ obj.cover_url }}" alt="" style="width: 80px;height: 20px"></td>
<td>{% if obj.is_delete %}是{% else %}否{% endif %}</td>
</tr>
{% endfor %}
{% endblock %}
1.3 路由
path('courses/', views.CourseListView.as_view(), name='course_list'),
2. 课程更新
2.1 视图
class CourseUpdateView(MyPermissionRequiredMixin, UpdateView):
permission_required = ('myadmin.course_update', )
model = Course
page_header = '在线课堂'
page_option = '课程管理'
table_title = '课程更新'
fields = ['title', 'category', 'teacher', 'profile', 'outline', 'duration', 'cover_url', 'video_url']
2.2 模板
{% extends 'admin/base/obj_detail.html' %}
{% block update_url %}
{% url 'myadmin:course_update' form.instance.id %}
{% endblock %}
{% block add_url %}
{% urlmyadmin:n:course_add' %}
{% endblock %}
2.3 路由
path('course/<int:pk>/', views.CourseUpdateView.as_view(), name='course_update'),
3. 课程添加
3.1 视图
class CourseAddView(MyPermissionRequiredMixin, AddView):
permission_required = ('myadmin.course_add', )
model = Course
page_header = '在线课堂'
page_option = '课程管理'
table_title = '课程添加'
fields = ['title', 'category', 'teacher', 'profile', 'outline', 'duration', 'cover_url', 'video_url']
3.2 模板
同更新视图
3.3 路由
path('course/', views.CourseAddView.as_view(), name='course_add'),