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

如何在Django Admin中实现通过OpenLibrary添加Book模型的功能?

在Django Admin中添加「通过OpenLibrary添加图书」按钮的实现方案

当然可以实现,以下是基于Django Admin原生扩展能力的具体步骤,完全复用你已有的from_open_library类方法:


1. 自定义Book Admin表单页面,添加导入按钮

首先在项目模板目录下创建Admin自定义模板(路径:templates/admin/[你的app名]/book/change_form.html,无对应目录则手动创建),复制Django默认的change_form.html内容后,在提交按钮区域插入自定义跳转按钮:

<!-- 在默认"保存"按钮组旁添加 -->
<div class="submit-row">
    <a href="{% url 'admin:book_import_from_openlibrary' %}" class="button">通过OpenLibrary添加</a>
</div>

然后在BookAdmin类中指定使用该模板:

# [你的app名]/admin.py
from django.contrib import admin
from .models import Book

class BookAdmin(admin.ModelAdmin):
    # 保留你原有的Admin配置(如list_display、search_fields等)
    change_form_template = 'admin/[你的app名]/book/change_form.html'

admin.site.register(Book, BookAdmin)

2. 创建导入专用表单与视图

2.1 编写导入表单

新建forms.py文件,定义包含OpenLibrary ID和Order选择的表单:

# [你的app名]/forms.py
from django import forms
from .models import Order

class OpenLibraryBookImportForm(forms.Form):
    open_library_key = forms.CharField(label='OpenLibrary ID', max_length=32, required=True)
    location = forms.ModelChoiceField(queryset=Order.objects.all(), label='所属订单', required=True)

2.2 编写导入处理视图

新建admin_views.py文件,实现表单提交逻辑,直接调用你已有的from_open_library方法:

# [你的app名]/admin_views.py
from django.contrib.admin.views.decorators import staff_member_required
from django.shortcuts import render, redirect
from django.contrib import messages
from django.contrib import admin
from .models import Book
from .forms import OpenLibraryBookImportForm

@staff_member_required
def import_book_from_openlibrary(request):
    if request.method == 'POST':
        form = OpenLibraryBookImportForm(request.POST)
        if form.is_valid():
            try:
                # 调用已有类方法创建图书
                book = Book.from_open_library(
                    open_library_key=form.cleaned_data['open_library_key'],
                    location=form.cleaned_data['location']
                )
                messages.success(request, f"成功导入图书:{book.title}")
                # 导入完成后跳回图书列表页
                return redirect('admin:[你的app名]_book_changelist')
            except Exception as e:
                # 捕获导入异常并提示管理员
                messages.error(request, f"导入失败:{str(e)}")
    else:
        form = OpenLibraryBookImportForm()
    
    # 渲染导入页面,保持Admin界面样式统一
    return render(request, 'admin/[你的app名]/book/import_from_openlibrary.html', {
        'form': form,
        'title': '通过OpenLibrary添加图书',
        'site_header': admin.site.site_header,
        'site_title': admin.site.site_title,
    })

3. 配置Admin路由

在项目urls.py中添加导入视图的路由,确保仅管理员可访问:

# project/urls.py
from django.contrib import admin
from [你的app名].admin_views import import_book_from_openlibrary

urlpatterns = [
    path('admin/', admin.site.urls),
    # 添加导入路由
    path('admin/book/import-from-openlibrary/', import_book_from_openlibrary, name='book_import_from_openlibrary'),
]

4. 创建导入页面模板

在templates/admin/[你的app名]/book/目录下新建import_from_openlibrary.html,继承Admin基础模板以保持样式统一:

{% extends "admin/base_site.html" %}
{% load i18n %}

{% block content %}
<div class="module">
    <h1>{{ title }}</h1>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <div class="submit-row">
            <input type="submit" value="{% trans '导入图书' %}" class="default">
            <a href="{% url 'admin:[你的app名]_book_changelist' %}" class="button">返回图书列表</a>
        </div>
    </form>
</div>
{% endblock %}

注意事项

  • 请将代码中的[你的app名]替换为实际应用名称
  • 若from_open_library可能抛出特定异常(如API请求失败、数据格式错误),可针对性捕获并给出更友好提示
  • 路由名称可按需调整,确保模板中url标签对应即可

内容的提问来源于stack exchange,提问作者niaei

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 12:15:21