django链式modelchoicefields动态查询集

时间:2015-03-19 21:09:39

标签: django django-forms django-views

我有一个带有两个modelchoice字段的表单来过滤折线图 第一个modelchoicefield填充了提供者列表

第二个modelchoicefield必须加载所选提供商的产品列表 机型:

class Proveedor(models.Model):
      id_proveedor = models.AutoField(primary_key = True)
      nombre = models.CharField(max_length=150,blank=False,null=False)
      codigo_asignado =  models.CharField(max_length=50,blank=False,null=False)
      id_servicio = models.ForeignKey(Servicio,db_column='id_servicio',verbose_name='Servicio')
      class Meta:
            verbose_name_plural = "Proveedor"

      def __unicode__(self):
          return self.nombre

class Product(models.Model):
      id_lista = models.IntegerField(primary_key=True)
      fecha = models.CharField(max_length=12)
      id_prov = models.ForeignKey(Proveedor,db_column='id_proveedor', verbose_name='Proveedor')
      corto = models.CharField(max_length=15)
      conteo = models.IntegerField()
      dia = models.CharField(max_length=24)
      class Meta:
            managed=False
            db_table='pc_v_stat_corto'

  def __unicode__(self):
      return self.corto

形式:

class ChartCCForm(forms.Form):
      provider = forms.ModelChoiceField(queryset=Proveedor.objects.all().order_by('nombre'),label='Proveedor')
      product = forms.ModelChoiceField(queryset=STAT_CORTO.objects.all(),to_field_name="corto",required=True)

      def __init__(self,*args, **kwargs):
          super(ChartCCForm, self).__init__(*args, **kwargs)
          self.helper = FormHelper()

我的观点

  def StatCortoView(request):
        formulario = ChartCCForm()
        prov = request.POST.get('id_proveedor')
        codigo = request.POST.get('codigo')
        mes = request.GET.get('mes')

        try:
            prov = prov
            codigo = codigo
            mes = mes
        except ValueError:
            prov = None
            codigo = None
            mes = None

        query = STAT_CORTO.objects.filter(id_prov=prov).filter(corto=codigo)
        ds = DataPool(
              series=
              [{'options': {
                  'source': query},
                  'terms': [
                     'dia',
                     'conteo']}
              ])
        cht = Chart(
            datasource = ds,
            series_options =
              [{'options':{
                  'type': 'line',
                  'stacking': False},
                'terms':{
                  'dia': [
                    'conteo']
                  }}],
            chart_options =
              {'title': {
                   'text': 'Codigos Cortos por Dia'},
               'xAxis': {
                    'title': {
                       'text': 'Fecha'}}})

        return render(request,'chartcc.html',
                                  {'grafico':cht,'form':formulario})

如何更新基于所选提供商的产品型号选择

提前致谢

1 个答案:

答案 0 :(得分:1)

使用Django表单时,您真正想要的是什么。表单只提供制作时的选择,因此您必须为所有可能的产品提供产品查询集,然后使用javascript在前端过滤它们。

见这里:conditional/contingent model field choices