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

如何在Django中关联PersonelModel与ArizaModel并保存表单数据

实现故障记录关联人员保存的步骤

1. 确认模型关联正确性

先确保你的models.py中外键关联配置无误,示例结构如下:

# models.py
from django.db import models

class PersonelModel(models.Model):
    p_sicil = models.CharField(max_length=50, unique=True, verbose_name="人员编号")
    p_ad = models.CharField(max_length=100, verbose_name="姓名")
    # 其他人员相关字段(如部门、职位等)

    def __str__(self):
        return f"{self.p_sicil} - {self.p_ad}"

class ArizaModel(models.Model):
    personel_ariza_acan = models.ForeignKey(PersonelModel, on_delete=models.CASCADE, verbose_name="提交故障人员")
    a_aciklama = models.TextField(verbose_name="故障描述")
    olusturma_tarihi = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")

    def __str__(self):
        return f"{self.personel_ariza_acan.p_sicil} - {self.a_aciklama[:20]}"

2. 编写带验证的表单

修改forms.py,创建包含人员编号查询、故障描述输入的表单,同时验证人员编号的有效性:

# forms.py
from django import forms
from .models import PersonelModel

class ArizaKayitForm(forms.Form):
    p_sicil = forms.CharField(label="人员编号", max_length=50)
    a_aciklama = forms.CharField(label="故障描述", widget=forms.Textarea)

    # 自定义验证:检查输入的人员编号是否存在
    def clean_p_sicil(self):
        sicil_numarasi = self.cleaned_data.get("p_sicil")
        if not PersonelModel.objects.filter(p_sicil=sicil_numarasi).exists():
            raise forms.ValidationError("该人员编号不存在,请重新输入")
        return sicil_numarasi

3. 实现视图逻辑

更新views.py,处理表单的GET/POST请求,完成人员查询与故障记录保存:

# views.py
from django.shortcuts import render, redirect
from .forms import ArizaKayitForm
from .models import PersonelModel, ArizaModel

def ariza_kaydet(request):
    personel_bilgisi = None
    if request.method == "POST":
        form = ArizaKayitForm(request.POST)
        if form.is_valid():
            # 获取验证后的表单数据
            sicil = form.cleaned_data["p_sicil"]
            aciklama = form.cleaned_data["a_aciklama"]
            # 关联对应人员实例
            personel = PersonelModel.objects.get(p_sicil=sicil)
            # 创建并保存故障记录
            ArizaModel.objects.create(
                personel_ariza_acan=personel,
                a_aciklama=aciklama
            )
            # 保存后重定向清空表单,避免重复提交
            return redirect("ariza_kaydet")
    else:
        form = ArizaKayitForm()
    
    return render(request, "ariza_kayit.html", {"form": form, "personel": personel_bilgisi})

4. 调整模板展示

修改HTML模板,显示表单、查询到的人员信息及验证错误:

<!-- ariza_kayit.html -->
<!DOCTYPE html>
<html>
<head>
    <title>故障记录提交</title>
</head>
<body>
    <h2>提交故障记录</h2>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">确认提交</button>
    </form>

    <!-- 展示查询到的人员信息 -->
    {% if personel %}
        <div style="margin-top: 20px; padding: 10px; border: 1px solid #ccc;">
            <h3>关联人员信息</h3>
            <p>人员编号:{{ personel.p_sicil }}</p>
            <p>姓名:{{ personel.p_ad }}</p>
            <!-- 按需展示其他人员字段 -->
        </div>
    {% endif %}

    <!-- 显示表单验证错误 -->
    {% if form.errors %}
        <div style="margin-top: 20px; color: red;">
            {% for field in form %}
                {% for error in field.errors %}
                    <p>{{ field.label }}:{{ error }}</p>
                {% endfor %}
            {% endfor %}
        </div>
    {% endif %}
</body>
</html>

5. 配置路由

在项目或应用的urls.py中添加对应路由:

# urls.py
from django.urls import path
from .views import ariza_kaydet

urlpatterns = [
    path("ariza-kaydet/", ariza_kaydet, name="ariza_kaydet"),
]

核心逻辑说明

  • 表单通过clean_p_sicil方法提前验证人员编号的合法性,避免后续保存时出现数据不存在的异常。
  • POST请求中,通过验证后的人员编号获取PersonelModel实例,直接关联到ArizaModel的外键字段完成保存。
  • 模板中实时展示查询到的人员信息,让用户确认提交对象的正确性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:35:17