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日

相关文章

  • 浅谈Python之Django(四)

    让我来详细讲解一下“浅谈Python之Django(四)”的完整攻略。 首先,这篇文章是关于如何使用Django框架进行Web开发的。文章主要介绍了在Django中处理表单、访问数据库以及进行模板渲染的方法和技巧。 文章分为以下几个部分: 一、表单处理 在这一部分,文章主要介绍了如何使用Django的表单功能来处理用户提交的表单数据。具体来说,包括以下内容:…

    Django 2023年5月16日
    00
  • Django使用jinja2模板的实现

    实现在Django中使用jinja2模板,需要以下步骤: 第一步:安装jinja2 在命令行输入以下命令,安装jinja2: pip install jinja2 第二步:配置Django项目 在Django项目的settings.py文件中,添加以下配置信息: TEMPLATES = [ { ‘BACKEND’: ‘django.template.back…

    Django 2023年5月16日
    00
  • django—表单集合Formset

    Formset(表单集)是多个表单的集合。Formset在Web开发中应用很普遍,它可以让用户在同一个页面上提交多张表单,一键添加多个数据,比如一个页面上添加多个用户信息。今天小编我就介绍下Django Formset的基础知识,Formset的分类以及如何使用Formset。     为什么要使用Django Formset 我们先来下看下Django中不…

    Django 2023年4月16日
    00
  • Django中多种重定向方法使用详解

    Django中多种重定向方法使用详解 Django提供了多种重定向方法,常用的有HttpResponseRedirect、redirect和HttpResponsePermanentRedirect。本文将详细介绍这几种方法的使用以及示例。 HttpResponseRedirect HttpResponseRedirect是一个HTTP重定向响应,可将用户重…

    Django 2023年5月16日
    00
  • django2.0+linux服务器 ,如何让自己电脑访问

    这几天一直在搞这个服务器端口开放问题,来让自己电脑可以访问服务器下的django网页,今天终于弄好了~~~~~离成功又进了一步~~~~~ 1.首先,我们来开放一个linux服务器的端口(我开放了8282端口)  1 iptables -A INPUT -p tcp –dport 8282 -j ACCEPT 2 iptables -A OUTPUT -p …

    Django 2023年4月13日
    00
  • Django Admin 删除文件同时删除资源文件(delete_upload_files)

    一  使用环境   开发系统: windows   IDE: pycharm     数据库: msyql,navicat   编程语言: python3.7  (Windows x86-64 executable installer)   虚拟环境: virtualenvwrapper   开发框架: Django 2.2 二 Django Admin 删…

    Django 2023年4月13日
    00
  • 动手实践记录(利用django创建一个博客系统)

    1.添加一个分类的标签,和主表的关系是 外键 class Category(models.Model): “”” 分类 “”” name = models.CharField(‘名称’, max_length=16) def __unicode__(self):# 在Python3中用 __str__ 代替 __unicode__ return self.n…

    Django 2023年4月13日
    00
  • Django – 模型表单(创建、更新、删除)

      urls.py # /music/alubm/add/ url(r’^album/add/$’, views.AlbumCreate.as_view(), name=”album-add”),   # /music/alubm/3/update/   url(r’^album/(?P<pk>\d+)/update/$’, views.Albu…

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