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

Django表单:根据所选Sigtap限制Cid10选项并实现单选

解决方案

1. 修改模型字段(将多选改为单选)

首先把Cirurgia模型中的ChainedManyToManyField替换为ForeignKey,满足单选诊断的需求:

# The "Surgical Procedure" model
class Cirurgia(models.Model):
    paciente = models.PositiveIntegerField(verbose_name='Número do prontuário')
    data = models.DateField(verbose_name='Data de realização')
    procedimento = models.ForeignKey(Sigtap, on_delete=models.CASCADE,
                                     verbose_name='Código do procedimento (SIGTAP)')
    # 替换原多对多字段为外键,实现单选
    cid = models.ForeignKey(
        Cid10, 
        on_delete=models.CASCADE, 
        verbose_name='CID-10',
        blank=True,
        null=True
    )

2. 创建CID-10的自动补全视图

新增Autocomplete视图,根据选中的Sigtap动态过滤关联的Cid10选项:

from dal import autocomplete
from .models import Cid10

class Cid10Autocomplete(autocomplete.Select2QuerySetView):
    def get_queryset(self):
        # 未登录用户返回空结果(可选配置)
        if not self.request.user.is_authenticated:
            return Cid10.objects.none()
        
        queryset = Cid10.objects.all()
        # 获取前端传递的选中Sigtap的ID
        procedimento_id = self.forwarded.get('procedimento', None)
        
        if procedimento_id:
            # 过滤出与该Sigtap关联的CID-10
            queryset = queryset.filter(sigtap_compativel__id=procedimento_id)
        
        # 支持按编码或描述搜索补全
        if self.q:
            queryset = queryset.filter(
                descricao__icontains=self.q
            ) | queryset.filter(
                codigo__icontains=self.q
            )
        
        return queryset.distinct()

3. 调整表单配置

修改CirurgiaModelForm,为cid字段配置带联动的ModelSelect2组件,指定依赖procedimento字段:

class CirurgiaModelForm(forms.ModelForm):
    class Meta:
        model = Cirurgia
        fields = ['paciente', 'data', 'procedimento', 'cid']
        widgets = {
            'procedimento': autocomplete.ModelSelect2(url='sigtap-autocomplete'),
            'cid': autocomplete.ModelSelect2(
                url='cid10-autocomplete',
                # 将procedimento字段的值传递给CID-10的自动补全视图
                forward=['procedimento'],
                attrs={
                    'data-placeholder': 'Selecione um CID-10 compatível',
                }
            ),
        }

4. 配置URL路由

在项目的urls.py中添加CID-10自动补全的路由:

from django.urls import path
from .views import SigtapAutocomplete, Cid10Autocomplete  # 导入已有的Sigtap视图和新增的Cid10视图

urlpatterns = [
    # 其他已有路由...
    path('sigtap-autocomplete/', SigtapAutocomplete.as_view(), name='sigtap-autocomplete'),
    path('cid10-autocomplete/', Cid10Autocomplete.as_view(), name='cid10-autocomplete'),
]

5. 模板中加载静态资源

确保在渲染表单的模板中加入{{ form.media }},加载DAL和Select2的JS/CSS资源,保证联动功能正常:

<!-- 表单所在模板 -->
<form method="post">
    {% csrf_token %}
    {{ form.media }}
    {{ form.as_p }}
    <button type="submit">Salvar</button>
</form>

修改完成后,用户选择Sigtap时,cid字段会自动过滤出仅与之关联的选项,且只能单选,同时保留了自动补全的功能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 06:35:50