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技术站