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

在Django Admin中为温度传感器模型实现两种实例化方式的方案

Django Admin集成温度传感器两种创建方式的实现方案

针对你的温度传感器注册系统需求,这里提供两种适配django-polymorphic模型的Admin集成方案,同时支持手动创建和从模型代码创建两种流程:


方案一:分离式入口——添加独立创建按钮

通过自定义Admin视图和模板,在列表页添加两个独立按钮,分别对应手动创建和模型代码创建流程。

1. 自定义列表页模板

创建templates/admin/tempsensor/change_list.html,继承默认Admin列表页并添加自定义按钮:

{% extends "admin/change_list.html" %}
{% block object-tools %}
    <ul class="object-tools">
        <li>
            <a href="{% url 'admin:create_tempsensor_manual' %}" class="addlink">创建温度传感器</a>
        </li>
        <li>
            <a href="{% url 'admin:create_tempsensor_from_code' %}" class="addlink">从模型代码创建</a>
        </li>
    </ul>
    {{ block.super }}
{% endblock %}

2. 扩展TempSensor Admin类

在admin.py中注册自定义Admin,添加视图路由和处理逻辑:

from django.contrib import admin
from django.urls import path
from django.shortcuts import render, redirect
from .models import TempSensor

class TempSensorAdmin(admin.ModelAdmin):
    change_list_template = "admin/tempsensor/change_list.html"

    def get_urls(self):
        # 追加自定义路由
        custom_urls = [
            path('create-manual/', self.admin_site.admin_view(self.create_manual), name='create_tempsensor_manual'),
            path('create-from-code/', self.admin_site.admin_view(self.create_from_code), name='create_tempsensor_from_code'),
        ]
        return custom_urls + super().get_urls()

    def create_manual(self, request):
        # 跳转到默认的手动添加表单页
        return redirect('admin:your_app_tempsensor_add')

    def create_from_code(self, request):
        if request.method == 'POST':
            # 调用已实现的create_from_model_code方法创建传感器
            model_code = request.POST.get('model_code')
            sensor = TempSensor.create_from_model_code(model_code)
            # 跳转到新创建传感器的详情页
            return redirect('admin:your_app_tempsensor_change', sensor.id)
        
        # GET请求返回模型代码输入表单
        return render(request, 'admin/tempsensor/create_from_code.html', {
            'title': '从模型代码创建温度传感器',
            'opts': self.model._meta,
        })

admin.site.register(TempSensor, TempSensorAdmin)

3. 创建模型代码输入模板

创建templates/admin/tempsensor/create_from_code.html:

{% extends "admin/base_site.html" %}
{% block content %}
    <div class="module">
        <h1>{{ title }}</h1>
        <form method="post">
            {% csrf_token %}
            <div class="form-row">
                <label for="model_code" style="display:block;margin-bottom:8px;">模型代码:</label>
                <input type="text" name="model_code" id="model_code" required style="width:300px;padding:4px;">
            </div>
            <div class="submit-row" style="margin-top:16px;">
                <input type="submit" value="创建" class="default">
            </div>
        </form>
    </div>
{% endblock %}

方案二:一体化表单——自动填充字段

在默认的手动创建表单中添加模型代码输入框,通过AJAX自动填充对应字段,实现两种创建方式在同一表单内切换。

1. 自定义TempSensor表单

在forms.py中扩展表单,添加模型代码字段:

from django import forms
from .models import TempSensor

class TempSensorForm(forms.ModelForm):
    model_code = forms.CharField(required=False, label="模型代码(自动填充)")

    class Meta:
        model = TempSensor
        fields = ['part_number', 'model_code']

    def save(self, commit=True):
        if self.cleaned_data.get('model_code'):
            # 优先使用模型代码创建实例
            return TempSensor.create_from_model_code(self.cleaned_data['model_code'])
        # 无模型代码时执行默认保存逻辑
        return super().save(commit=commit)

2. 扩展Admin类并添加AJAX支持

在admin.py中注册表单,添加AJAX视图和前端脚本:

from django.contrib import admin
from django.urls import path
from django.http import JsonResponse
from .models import TempSensor
from .forms import TempSensorForm

class TempSensorAdmin(admin.ModelAdmin):
    form = TempSensorForm

    class Media:
        # 引入自定义JS实现自动填充
        js = ('admin/js/tempsensor_auto_fill.js',)

    def get_urls(self):
        custom_urls = [
            path('get-fields-from-code/', self.admin_site.admin_view(self.get_fields_from_code), name='get_fields_from_code'),
        ]
        return custom_urls + super().get_urls()

    def get_fields_from_code(self, request):
        # 解析模型代码,返回对应字段值(根据你的create_from_model_code逻辑调整)
        code = request.GET.get('code', '')
        data = {}
        if code.startswith('A1-'):
            data['type'] = 'A1'
            data['calibration'] = code[3]
            data['junction'] = code[4]
        elif code.startswith('B1-'):
            data['type'] = 'B1'
            data['calibration'] = code[3]
            data['termination'] = code[4]
        return JsonResponse(data)

admin.site.register(TempSensor, TempSensorAdmin)

3. 编写自动填充JS脚本

创建static/admin/js/tempsensor_auto_fill.js:

document.addEventListener('DOMContentLoaded', function() {
    const codeInput = document.getElementById('id_model_code');
    if (!codeInput) return;

    codeInput.addEventListener('blur', function() {
        const code = this.value.trim();
        if (!code) return;

        // 发送AJAX请求获取字段数据
        fetch(`/admin/your_app/tempsensor/get-fields-from-code/?code=${encodeURIComponent(code)}`)
            .then(res => res.json())
            .then(data => {
                // 根据传感器类型填充对应字段
                if (data.type === 'A1') {
                    document.getElementById('id_calibration')?.setAttribute('value', data.calibration);
                    document.getElementById('id_junction')?.setAttribute('value', data.junction);
                } else if (data.type === 'B1') {
                    document.getElementById('id_calibration')?.setAttribute('value', data.calibration);
                    document.getElementById('id_termination')?.setAttribute('value', data.termination);
                }
            })
            .catch(err => console.error('自动填充失败:', err));
    });
});

方案选择建议

  • 若两种创建流程差异较大,需要完全分离操作路径,选择方案一;
  • 若希望用户在同一表单内灵活切换手动输入和自动填充,操作更连贯,选择方案二。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 13:45:13