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日志配置

    Django使用Python内建的logging模块打印日志,配置由四个部分组成 记录器:Logger 处理程序:Handler 过滤器:Filter 格式化:formatter   记录器-Logger Logger为日志系统的入口,每个logger命名都是bucket,可以向bucket写入需要处理的消息 Python定义以及几种日志级别: DEBUG:…

    2023年4月10日
    00
  • Django学习笔记:django orm extra

    extra 在django orm中使用复杂的sql语句extra(select=None, where=None, params=None, tables=None, order_by=None, select_params=None) 有些情况下,Django 的查询语法难以简练地表达复杂的 WHERE 子句。对于这种情况,Django 提供了 extr…

    Django 2023年4月9日
    00
  • 第十三篇Django Logging配置样例

    阅读目录(Content) Django 日志配置模板 官方链接 Django Logging Django 日志配置模板 LOGGING = { ‘version’: 1, ‘disable_existing_loggers’: False, ‘formatters’: { ‘standard’: { ‘format’: ‘[%(asctime)s][%(…

    Django 2023年4月16日
    00
  • django中F与Q查询的使用

    当使用Django ORM查询数据时,查询操作的灵活性是非常重要的。而F和Q查询就是在这种情况下用来实现更复杂、更灵活查询的。本文将介绍F和Q查询的用法,并参考两个示例说明。 F查询 F查询是一种常用的查询方法,用于在查询过程中引用Model实例中的字段。使用F查询时,可以将字段名作为参数传递给F对象,例如下面的查询将查找所有被评论数等于点赞数的博客文章: …

    Django 2023年5月16日
    00
  • python Django模板的使用方法(图文)

    下面是“Python Django模板的使用方法(图文)”的完整攻略,包含两个示例说明: 1. 简介 Django模板是一种文本文件,它用于生成HTML和其他格式的文档。Django模板语言(DTL)是由Django框架提供的一种HTML syntax,它使我们可以根据需要构造HTML页面。 在Django中,我们可以使用Django模板系统来渲染HTML页…

    Django 2023年5月16日
    00
  • django-admin.py创建项目失败解决方法

    环境:Ubuntu、python2.7、django1.9.5 当用django-admin.py startproject projectName创建对应的django项目时出现command not found: django-admin.py情况的解决方案: 找到对应的文件django-admin.py的路径:            如图运行相关命令:…

    Django 2023年4月10日
    00
  • 在Django中使用ElasticSearch

    在Django中使用ElasticSearch需要以下步骤: 安装Elasticsearch和Python Elasticsearch客户端Elasticsearch可以在其官方网站上进行下载,并且有相应的安装教程。Python Elasticsearch客户端可以使用pip安装,命令为:pip install elasticsearch 在Django项目…

    Django 2023年5月16日
    00
  • Django-URL路由配置

    目录 一、URL配置 参数说明 二 、正则表达式详解 注意事项 捕获的参数永远都是字符串: 三、include其他的URLconfs(也叫URL分发) 四、传递额外的参数给视图函数 五、命名URL(别名)和URL的反向解析 六、命名空间模式 一、URL配置   URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用…

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