You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:43:38