求Django Admin中新增完整视图(含表单、查询集、模板)的示例教程
完整实现Django Admin自定义新增视图的分步方案
我完全懂这种官方文档只给零散片段,找不到完整端到端示例的抓狂感!下面给你一套包含视图、表单、查询集、模板的完整Django Admin自定义新增视图实现方案,直接可以复用:
1. 先定义示例模型(以图书模型为例)
假设我们有一个Book模型,作为自定义新增视图的操作对象:
# models.py from django.db import models class Book(models.Model): title = models.CharField(max_length=200) author = models.CharField(max_length=100) publish_date = models.DateField() is_published = models.BooleanField(default=False) def __str__(self): return self.title
2. 自定义新增表单(如果需要和默认表单不同)
如果你的自定义新增需要特殊字段、验证逻辑,就创建一个自定义ModelForm:
# admin.py from django import forms from .models import Book class CustomBookAddForm(forms.ModelForm): # 可以添加额外字段或者重写现有字段 extra_note = forms.CharField( required=False, widget=forms.Textarea(attrs={'rows':3}), label="备注信息" ) class Meta: model = Book fields = ['title', 'author', 'publish_date', 'is_published'] # 自定义验证逻辑 def clean_title(self): title = self.cleaned_data.get('title') if len(title) < 3: raise forms.ValidationError("书名长度不能少于3个字符") return title
3. 实现带自定义新增视图的Admin类
这是核心部分,我们要继承ModelAdmin,添加自定义视图并配置路由:
# admin.py 继续编写 from django.contrib import admin from django.shortcuts import render, redirect from django.urls import path class BookAdmin(admin.ModelAdmin): # 配置默认列表页显示字段(可选) list_display = ['title', 'author', 'publish_date', 'is_published'] def get_urls(self): # 新增自定义路由,要放在默认路由前面或者合并 custom_urls = [ path('add-custom/', self.admin_site.admin_view(self.custom_add_view), name='book_add_custom'), ] # 合并默认Admin路由和自定义路由 return custom_urls + super().get_urls() def custom_add_view(self, request): # 检查用户是否有添加权限 if not self.has_add_permission(request): return self.admin_site._message_user(request, "你没有添加权限", level='error') if request.method == 'POST': form = CustomBookAddForm(request.POST) if form.is_valid(): # 保存表单数据,这里可以处理extra_note字段(如果需要) book = form.save() # 可以添加额外逻辑,比如记录操作日志 self.message_user(request, f"图书《{book.title}》已成功添加") # 跳转回图书列表页 return redirect('admin:myapp_book_changelist') else: # GET请求时初始化表单 form = CustomBookAddForm() # 渲染自定义模板,传入必要的上下文 context = { **self.admin_site.each_context(request), 'title': '自定义新增图书', 'form': form, 'opts': self.model._meta, 'media': self.media, } return render(request, 'admin/book/add_custom.html', context) # 注册Admin admin.site.register(Book, BookAdmin)
4. 编写自定义新增模板
在你的项目模板目录下创建templates/admin/book/add_custom.html,继承Admin的基础模板,确保风格和默认Admin一致:
{% extends "admin/base_site.html" %} {% load i18n admin_urls static admin_modify %} {% block extrahead %}{{ block.super }} <script type="text/javascript" src="{% url 'admin:jsi18n' %}"></script> {{ media }} {% endblock %} {% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} change-form{% endblock %} {% block content %} <div class="main shifted"> <div class="content"> <h1>{% trans '自定义新增图书' %}</h1> {% if form.errors %} <p class="errornote"> {% if form.errors.items|length == 1 %}{% trans "Please correct the error below." %}{% else %}{% trans "Please correct the errors below." %}{% endif %} </p> {% endif %} <div class="module"> <form method="post" novalidate> {% csrf_token %} <div class="form-row"> {{ form.as_p }} </div> <div class="submit-row"> <input type="submit" value="{% trans '保存' %}" class="default"> <a href="{% url 'admin:myapp_book_changelist' %}" class="button">{% trans '返回列表' %}</a> </div> </form> </div> </div> </div> {% endblock %}
5. 测试访问
启动Django服务器后,访问路径:http://localhost:8000/admin/myapp/book/add-custom/(注意替换myapp为你的应用名),就能看到自定义的新增页面了,功能完全和默认新增视图对齐,还能扩展自己的逻辑。
额外说明
- 如果不需要自定义表单,直接用默认的
self.get_form(request)即可替代CustomBookAddForm - 可以在
custom_add_view中自定义查询集,比如限制某些用户只能添加特定分类的图书 - 如果需要更复杂的交互,比如AJAX,可以在模板中引入自定义JS
内容的提问来源于stack exchange,提问作者eli
相关产品推荐
相关产品推荐

