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

