[django项目] 使用自定义通用视图

本文详细介绍如何使用自定义通用视图实现新闻标签、热门新闻、轮播图、文档及课程的管理功能,涵盖列表展示、更新、添加操作,简化视图创建流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用自定义通用视图

我们编写好了自定义通用视图, 它大大简化了创建一个新视图的方式, 接下来我们来使用它创建我们其他的菜单

一、新闻标签管理功能

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>
            <td style="width: 100px">
                <button type="button" class="btn btn-danger btn-xs delete"
                data-url="{% url 'myadmin:tags_update' obj.id %}">删除</button>
            </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 模板

同更新模板myadmin/tag/tag_detail.html

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'),
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值