2013-07-11 5 views
1

меня следующим образом, у меня есть модель Producto, что одно поле является внешним ключом к другой модели под названием Categoria так:Populate выпадающий список другой списка в Джанго с FormSets

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, поэтому, когда пользователь делает выбор, другой раскрывающийся список - это фильтр со списком продуктов, основанных на этой категории, что-то вроде выпадающего списка для стран и городов в форме регистрации из многих веб-сайтов в Интернете, для этого я сделал modelformset_factory для деталь заказа, где i nsertion продукта происходит:

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, но я не знаю, как определить для набора форм, любые идеи?

С уважением!

ответ

0

У меня была аналогичная проблема, связанная с заполнением выпадающих меню в наборе форм на основе пользовательского выбора (который может быть несколько строк в таблице). То, что сработало для меня было изменить base_fields в formset, прежде чем я положил выбранные строки в 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') 

«выбор» список выбранных строк на предыдущей странице.

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 требует кортежа, чтобы работать должным образом и имя значение, которое я хочу в капле вниз.

Надеюсь, это поможет. Если вы хотите, чтобы сбрасывание динамически менялось на стороне клиента, вам нужно будет написать JavaScript для заполнения раскрывающихся меню.

Смежные вопросы