Django项目中使用ModelForm提交CaseRegister模型数据的问题
解决Django中使用ModelForm提交CaseRegister模型数据的问题
首先,先把你提供的模型代码片段整理出来:
我正在开发一个Django项目,尝试使用ModelForm提交CaseRegister模型的数据。以下是我的模型类代码片段(model.py):
from django.db import models from core.models import ProviderMaster,FacilityMaster,CaseMaster,CasestatusMaster from patient.models import PatientMaster from django.contrib.auth.models import User from django.forms import ModelForm from account.models import Profile def update_id(func): def decorated_function(*args): data_object = args[0] sequence_n... # 这里代码未完成
看起来你的代码片段不完整,尤其是update_id装饰器的逻辑没写完,这可能会影响模型的正常工作。我来一步步帮你实现完整的ModelForm提交流程:
1. 完善CaseRegister模型及装饰器逻辑
先补全update_id装饰器(假设你想用它生成自定义的Case ID),然后定义完整的CaseRegister模型:
from django.db import models from core.models import ProviderMaster, FacilityMaster, CaseMaster, CasestatusMaster from patient.models import PatientMaster from django.contrib.auth.models import User from account.models import Profile def update_id(func): def decorated_function(*args): data_object = args[0] # 示例:生成自定义的Case ID,比如按日期+序号的格式 if not data_object.case_id: # 获取最新的CaseRegister记录,自增序号 last_case = CaseRegister.objects.order_by('-id').first() next_seq = last_case.id + 1 if last_case else 1 data_object.case_id = f"CASE-{next_seq:04d}" return func(*args) return decorated_function class CaseRegister(models.Model): case_id = models.CharField(max_length=20, unique=True, blank=True) patient = models.ForeignKey(PatientMaster, on_delete=models.CASCADE) provider = models.ForeignKey(ProviderMaster, on_delete=models.SET_NULL, null=True) facility = models.ForeignKey(FacilityMaster, on_delete=models.SET_NULL, null=True) case_status = models.ForeignKey(CasestatusMaster, on_delete=models.SET_DEFAULT, default=1) created_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) # 使用装饰器处理case_id的自动生成 @update_id def save(self, *args, **kwargs): super().save(*args, **kwargs)
2. 创建对应的ModelForm
在forms.py中定义ModelForm,指定要包含的字段:
from django import forms from .models import CaseRegister class CaseRegisterForm(forms.ModelForm): class Meta: model = CaseRegister # 指定需要在表单中显示的字段,排除自动生成的case_id、created_at等 fields = ['patient', 'provider', 'facility', 'case_status'] # 可选:为字段添加自定义样式或标签 widgets = { 'patient': forms.Select(attrs={'class': 'form-control'}), 'provider': forms.Select(attrs={'class': 'form-control'}), 'facility': forms.Select(attrs={'class': 'form-control'}), 'case_status': forms.Select(attrs={'class': 'form-control'}), }
3. 在视图中处理表单提交
在views.py中编写视图函数,处理GET请求展示表单,POST请求提交数据:
from django.shortcuts import render, redirect from .forms import CaseRegisterForm from django.contrib.auth.decorators import login_required @login_required def create_case(request): if request.method == 'POST': form = CaseRegisterForm(request.POST) if form.is_valid(): # 先获取表单实例,手动设置created_by为当前登录用户 case = form.save(commit=False) case.created_by = request.user case.save() # 保存后重定向到病例列表页或详情页 return redirect('case_list') else: form = CaseRegisterForm() return render(request, 'cases/create_case.html', {'form': form})
4. 在模板中渲染表单
创建模板cases/create_case.html,渲染表单:
{% extends 'base.html' %} {% block content %} <h2>创建新病例</h2> <form method="post"> {% csrf_token %} {{ form.as_p }} <button type="submit" class="btn btn-primary">提交病例</button> </form> {% endblock %}
常见问题排查
- 如果表单验证失败,检查模型字段的约束(比如外键是否存在必填项、字段长度是否符合要求)
- 确保
update_id装饰器逻辑正确,不会导致case_id重复或生成失败 - 视图中要记得手动填充
created_by这类自动赋值的字段,避免触发数据库约束错误
内容的提问来源于stack exchange,提问作者prakash joy
相关产品推荐
相关产品推荐

