Django admin组件的使用

Django是一个非常流行的Python Web开发框架。它自带了一个非常强大的组件,称为Django admin。这个组件很容易使用,使得在无需编写控制面板代码的情况下,你就可以创建一个功能强大的控制面板。在本文中,我将详细讲解如何使用Django admin组件。

第一步:创建Django项目

首先,我们需要在本地机器上创建一个Django项目。使用以下命令:

django-admin startproject myproject

这将在本地机器上创建一个名为"myproject"的Django项目。

第二步:创建Django应用程序

接下来,创建一个Django应用程序。使用以下命令:

cd myproject
python manage.py startapp myapp

这将在我们的Django项目中创建一个名为"myapp"的应用程序。

第三步:创建模型

使用Django admin组件,我们将在控制面板上管理一个模型。在这个示例中,我们将创建一个简单的模型,表示一个图书馆中的书籍。创建一个新的文件,在myapp文件夹下创建"models.py"。

现在,定义一个书籍的模型:

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=50)
    author = models.CharField(max_length=50)
    published_date = models.DateField()
    pages = models.IntegerField(default=0)

    def __str__(self):
        return f"{self.title}"

在这段代码中,我们定义了一个名为"Book"的模型,它有四个字段: 书名、作者、发布日期和页数。

第四步:运行数据库迁移

现在,我们需要运行数据库迁移命令:

python manage.py makemigrations myapp
python manage.py migrate

这将创建数据表,以便我们可以将数据存储到数据库中。

第五步:创建超级用户

为了登录到控制面板,我们需要创建一个超级用户。使用以下命令:

python manage.py createsuperuser

按照提示进行操作,创建一个用户名和密码。

第六步:注册模型

在使用Django admin组件前,我们需要在我们的应用程序中注册我们的模型。打开myapp文件夹下的"admin.py",添加以下代码:

from django.contrib import admin
from .models import Book

admin.site.register(Book)

现在,我们已经在控制面板上注册了我们的Book模型。

第七步:开始使用Django admin组件

现在我们已经准备好使用Django admin组件了。运行以下命令,以启动Django开发服务器:

python manage.py runserver

在浏览器中打开"127.0.0.1:8000/admin",输入你之前创建的超级用户的用户名和密码,登录到控制面板。

现在你应该可以看到你的模型"Book"。你可以选择"add"按钮,来添加一本新书。你可以在"book"页面中管理所有书籍。

第八步:高级用法示例(基于用户权限的书籍查询)

现在我们将介绍更高级的用法示例。我们将向控制面板添加一个查询页面,允许用户根据权限和书籍作者来查看书籍。

首先,为Book模型添加一个"owner"字段,表示书籍的所有者。修改"models.py"文件如下:

from django.db import models
from django.contrib.auth.models import User

class Book(models.Model):
    title = models.CharField(max_length=50)
    author = models.CharField(max_length=50)
    published_date = models.DateField()
    pages = models.IntegerField(default=0)
    owner = models.ForeignKey(User, on_delete=models.CASCADE, null=True)

    def __str__(self):
        return f"{self.title}"

在这段代码中,我们添加了一个名为"owner"的字段,并使用ForeignKey建立了与Django内置的用户模型(User)的关联。

接下来,创建一个名为"myapp/templates/book_list.html"的HTML模板,用于书籍列表页面:

{% extends "admin/base.html" %}

{% block content %}
<h1>Book List</h1>
{% if user.is_superuser %}
  <h3>所有书籍</h3>
{% else %}
  <h3>我的书籍</h3>
{% endif %}
<form method="GET">
  <input type="text" name="author" placeholder="按作者搜索">
  <input type="submit" value="搜索">
</form>
<table>
  <tr>
    <th>书名</th>
    <th>作者</th>
    <th>发布日期</th>
    <th>页数</th>
    {% if user.is_superuser %}
      <th>所有者</th>
    {% endif %}
  </tr>
  {% for book in books %}
    {% if user.is_superuser or book.owner == user %}
      <tr>
        <td>{{ book.title }}</td>
        <td>{{ book.author }}</td>
        <td>{{ book.published_date }}</td>
        <td>{{ book.pages }}</td>
        {% if user.is_superuser %}
          <td>{{ book.owner }}</td>
        {% endif %}
      </tr>
    {% endif %}
  {% endfor %}
</table>
{% endblock %}

在这个HTML模板中,我们使用了Django内置的模板继承和模板变量,来实现一个可以根据作者搜索所有书籍或者查看当前用户所有书籍的页面。

接下来,在"myapp/admin.py"文件中添加以下代码:

from django.urls import reverse
from django.utils.html import format_html
from django.shortcuts import redirect
from django.contrib import admin
from django.contrib.auth.decorators import login_required
from django.views.generic import TemplateView
from .models import Book

class BookListView(TemplateView):
    template_name = 'book_list.html'

    @login_required
    def get(self, request, *args, **kwargs):
        if request.user.is_superuser:
            books = Book.objects.all()
        else:
            books = Book.objects.filter(owner=request.user)
        author = request.GET.get('author')
        if author:
            books = books.filter(author__icontains=author)
        context = {
          'books': books,
          'user': request.user,
        }
        return self.render_to_response(context)

class BookAdmin(admin.ModelAdmin):
    change_list_template = 'book_change_list.html'

    def get_urls(self):
        urls = super().get_urls()
        my_urls = [
            path('list/', self.admin_site.admin_view(BookListView.as_view()), name='myapp_book_list'),
        ]
        return my_urls + urls

    def changelist_view(self, request, extra_context=None):
        if not request.user.is_superuser:
            return redirect(reverse('admin:myapp_book_list'))
        return super().changelist_view(request, extra_context)

    def has_add_permission(self, request):
        return False

    def save_model(self, request, obj, form, change):
        if not obj.owner:
            obj.owner = request.user
        obj.save()

admin.site.register(Book, BookAdmin)

在这段代码中,我们创建了一个自定义的Django admin视图函数,用于根据权限和"author"参数来显示书籍列表。我们还定义了一个名为"BookAdmin"的Django admin选项类,并使用自定义的模板来替换默认的Django admin模板。

我们在"get_urls"方法中注册了一个URL,用于将Django admin中的"list"链接重定向到我们刚刚创建的自定义"BookListView"视图。在"changelist_view"方法中,我们检查用户是否是超级用户。如果是,它将返回默认的Django admin列表视图;如果不是,它将重定向到我们创建的自定义"BookListView"视图。

我们还禁用了"Book"模型的"add"权限,以确保用户可以查看或编辑自己的书籍,而无法添加新的书籍。最后,我们重载了"save_model"方法,以设置书籍的所有者为当前用户。

现在,如果你重新加载Django admin页面,你应该可以看到一个新的"书籍列表"链接。点击这个链接,你应该可以看到一个根据你的权限和"author"参数来显示书籍列表的页面。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django admin组件的使用 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • django models分页

    utils/pager.py class Pagination(object): def __init__(self, current_page, all_count, base_url, query_params, per_page=30, pager_page_count=11): “”” 分页初始化 :param current_page: 当前页码 …

    Django 2023年4月11日
    00
  • Django REST framework 视图和路由详解

    Django REST framework(DRF)是一种基于 Django 的强大且灵活的工具,可帮助我们更轻松地为我们的 Django 应用程序创建 RESTful API。它提供了一组工具和库来帮助我们构建更有效的 Web API,并包括功能强大的序列化,认证,请求,响应和路由工具等功能。 DRF 包含了许多构建 Web API 所需的基本组件,但是我…

    Django 2023年5月16日
    00
  • Python Django框架中表单的用法详解

    接下来我会详细讲解“Python Django框架中表单的用法详解”的完整攻略,包括两条示例说明。 什么是表单 表单是网页中最常见的交互方式,用户可以在表单中输入数据并提交到服务器进行处理。在 Django 框架中,可以通过表单生成 HTML 标签,还能够验证用户输入的数据,为后续的处理提供基础。下面是在 Django 中使用表单的步骤。 创建表单 在 Dj…

    Django 2023年5月16日
    00
  • 给django视图类添加装饰器

    要将login_required装饰到view class的dispatch方法上, 因为dispatch方法为类方法,不是单个的函数,所以需要将装饰函数的装饰器 login_required转化为装饰类方法的装饰器,就要用到method_decorator . method_decorator的参数可以是单个装饰器,也可是一个装饰器组成的列表   from…

    Django 2023年4月9日
    00
  • Django中Q查询及Q()对象 F查询及F()对象用法

    Django中的Q查询和F查询是Django ORM中的两个重要的查询方式。本文将详细介绍Q查询及Q()对象和F查询及F()对象的用法。本文的目标读者是具有Django基础的开发者。 ## Q查询及Q()对象 Q查询是Django ORM中的高级查询方式,可以用于复杂的查询语句。Q查询本质上是一个查询条件,它可以AND、OR、NOT等逻辑操作符组合在一起。 …

    Django 2023年5月16日
    00
  • Django restful 规范

    一、REST Frame Work – REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角度类审视整个网络,它将分布在网络中某个节点的资源通过URL进行标识,客户端应用通过URL来获取资源的表征,获得这些表征致使这些应用转变状态 REST…

    Django 2023年4月10日
    00
  • Django设置/获取/删除session

    # 设置sessiondef setSession(request): request.session[‘username’] = ‘ruan’ request.session[‘isLogin’] = True return HttpResponse(‘OK’)# 获取session def GetSession(request): isLogin = r…

    Django 2023年4月13日
    00
  • django-pip安装

    1.打开命令提示工具win+r   输入cmd打开提示工具 输入一下代码查看你的pip版本 pip –version 2.输入一下命令下载django(默认下载的是最新版本的) pip install django 3.输入命令查看你有没有下载成功django python -m django –version  4.安装成功后如何创建djago项目 c…

    Django 2023年4月12日
    00
合作推广
合作推广
分享本页
返回顶部