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

在Django中通过表单输入匹配主键提取Queryset的实现方法

实现支持RFID匹配的Django表单与模型整合方案

先确认你现有RFID模型的结构没问题,主键用rf_id存储RFID编号,关联设备编号的逻辑很清晰:

from django.db import models

class RFID(models.Model):
    rf_id = models.CharField(max_length=10, primary_key=True)
    equipment_number = models.CharField(max_length=11, default="0")  # 这里把default=0改成字符串更适配CharField类型

    def __str__(self):
        return self.rf_id

接下来帮你把未写完的扫描表单补全,我们用CharField来接收RFID输入,长度和模型的rf_id保持一致,还可以加个输入提示让用户更清楚:

from django import forms

class RFID_Scan(forms.Form):
    rf_scan = forms.CharField(
        max_length=10,
        label="扫描RFID",
        widget=forms.TextInput(attrs={'placeholder': '请输入/扫描RFID编号'})
    )

核心的匹配逻辑放在视图里,当表单提交验证通过后,用输入的RFID值匹配模型的主键rf_id,把查询到的结果存为变量。这里一定要注意捕获不存在的情况,避免程序直接报错:

from django.shortcuts import render
from .models import RFID
from .forms import RFID_Scan
from django.core.exceptions import ObjectDoesNotExist

def rfid_scan_view(request):
    matched_rfid = None  # 用来存储匹配到的RFID对象
    if request.method == 'POST':
        form = RFID_Scan(request.POST)
        if form.is_valid():
            rf_input = form.cleaned_data['rf_scan']
            try:
                # 匹配模型主键rf_id,获取对应记录
                matched_rfid = RFID.objects.get(rf_id=rf_input)
                # 这里可以加后续操作,比如跳转到设备详情页、记录扫描日志等
            except ObjectDoesNotExist:
                # 处理RFID不存在的情况,给用户明确提示
                form.add_error('rf_scan', '该RFID编号未关联任何设备')
    else:
        form = RFID_Scan()
    
    return render(request, 'your_scan_template.html', {'form': form, 'matched_rfid': matched_rfid})

在模板里你可以直接调用matched_rfid变量展示结果,比如:

{% if matched_rfid %}
    <div class="success提示">
        匹配成功!对应设备编号:{{ matched_rfid.equipment_number }}
    </div>
{% endif %}

小建议:如果是实际的RFID硬件扫描,通常会自动填充输入框并触发提交,你可以在前端加个监听输入事件的JS逻辑,自动提交表单,提升扫描效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:36:59