如何在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
相关产品推荐
相关产品推荐

