首页 文章

使用formset在django中的另一个下拉列表填充下拉列表

提问于
浏览
1

我有如下,我有一个模型 Producto ,一个字段是另一个模型的外键,名为 Categoria ,如下所示:

class Categoria(models.Model):
   nombre = models.CharField(max_length=500)
   description = models.TextField(blank=True)
   imagen = models.ImageField(upload_to="/media/categorias", blank=True)

class Producto(models.Model):
   referencia = models.CharField(max_length=30)
   nombre = models.CharField(max_length=500)
   cantidad = models.IntegerField()
   precio_unidad = models.FloatField(blank=True)
   cantidad_en_pedido = models.IntegerField(blank=True)
   descatalogado = models.BooleanField(blank=True)
   proveedor = models.ForeignKey(Proveedor,related_name="proveedor",blank=True,null=True)
   categoria = models.ForeignKey(Categoria,related_name="categoria",blank=True,null=True)
   imagen = models.ImageField(upload_to="/media/productos", blank=True)

因此,当用户想要下订单时,我需要为 Categoria 制作一个下拉列表,这样当用户做出选择时,另一个下拉列表会过滤出基于此类别的产品列表,例如国家和城市的下拉列表在网络上的许多网站的表单注册中,为此,我为 order detail 制作了一个modelformset_factory,其中插入了产品:

PedidoForm = modelform_factory(Pedido, exclude=("producto",),formfield_callback=make_custom_datefield)
DetallePedidoFormSet = modelformset_factory(Detalle_Pedido,exclude=("unidad_precio","pedido",), extra=1 )

这是获取订单表格的观点:

def add_pedido(request):
    if request.POST:
        pedido_form = PedidoForm(request.POST, prefix='pedido')
        detalle_pedido_formset = DetallePedidoFormSet(request.POST, prefix='detalle_pedido')
        if pedido_form.is_valid() and detalle_pedido_formset.is_valid():
            pedido = pedido_form.save()
            nuevos_detalles_pedido = detalle_pedido_formset.save(commit=False)
            for nuevo_detalle_pedido in nuevos_detalles_pedido:
                nuevo_detalle_pedido.unidad_precio = nuevo_detalle_pedido.producto.precio_unidad
                nuevo_detalle_pedido.pedido = pedido
                nuevo_detalle_pedido.save()
            detalle_pedido_formset.save_m2m()
            return HttpResponseRedirect("/ventas/pedidos")
        #else:
            # form_errors = form.errors
            # return render_to_response("ventas/form.html", {'form_errors':form_errors,'form':form},
            #  context_instance=RequestContext(request))
    else:
        pedido_form = PedidoForm(prefix='pedido')
        detalle_pedido_formset = DetallePedidoFormSet(queryset=Detalle_Pedido.objects.none(),prefix='detalle_pedido') # or give a different initial queryset if you want some preselected choice
    extra_context = {'form_pedido': pedido_form, 'detalle_pedido_formset': detalle_pedido_formset}
    return render_to_response("ventas/form_pedido.html", extra_context,
             context_instance=RequestContext(request))

如何在我的formsets中定义这个,许多网站建议做 ModelChoiceField 但我不知道如何定义一个formset,任何想法?

问候!

1 回答

  • 0

    我有一个类似的问题,与基于用户选择(可能是表中的多行)填充表单集中的下拉菜单有关 . 对我来说有用的是修改formset中的base_fields,然后将所选行放在formset中,如下所示:

    formset = modelformset_factory(mymodel)
    
    formset.form.base_fields['my_parameter'] = forms.ChoiceField(choices=getMyParamChoices())
    
    finalformset = formset(queryset=model.objects.filter(id__in=request.POST.getlist('selection')
    

    'selection'是上一页中所选行的列表 .

    getMyParamChoices()是一个查询模型以获取下拉选项列表的函数,如下所示:

    def getMyParamChoices():
    '''Go get the list of names for the drop down list.'''
    all = anothermodel.objects.all()
    params = []
    for item in all:    
        new1 = (item.name,item.name)
        params.append(new1)
    
    return(tuple(params))
    

    ChoiceField需要一个元组才能正常工作,name是我在下拉列表中想要的值 .

    我希望这有帮助 . 如果您希望下拉菜单在客户端动态更改,那么您需要编写一些JavaScript来填充下拉菜单 .

相关问题