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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:54:40