django项目--使用自定义通用视图

一、新闻标签管理功能

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'),
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容