django 模板-获取参数列表

a8jjtwal  于 2023-10-21  发布在  Go
关注(0)|答案(1)|浏览(138)
class ParametroProducto(models.Model):
    parametros_producto = models.CharField(max_length = 30)
    tipo_parametro = models.CharField(max_length = 80)

 class FamiliaProducto(models.Model):
    nombre_familia = models.CharField(max_length = 100)
    parametro_familia = models.ManyToManyField(ParametroProducto)

 class Producto(models.Model):
    nombre = models.CharField(max_length=100, unique=True)
    proveedores = models.ManyToManyField(Proveedor, null=True, blank=True)
    familia = models.ForeignKey(FamiliaProducto, on_delete=models.CASCADE)
    procedencia = models.CharField(max_length=100)

class Recepcion_Envase_Insumo(models.Model):
    proveedor = models.ForeignKey(Proveedor, on_delete=models.CASCADE)
    responsable = models.ForeignKey(Empleado, on_delete=models.CASCADE)
    producto = models.ForeignKey(Producto, on_delete=models.CASCADE)
    deposito = models.CharField(null=False,max_length=30)
    fecha = models.DateField(null=False,default=date.today)
    cantidad = models.IntegerField(null=False)
    observaciones = models.TextField()

 class ControlEnvIns(models.Model):
    envase_insumo = models.ForeignKey(Recepcion_Envase_Insumo, on_delete=models.CASCADE)
    parametro_env_ins = models.ForeignKey(ParametroProducto, on_delete=models.CASCADE)
    resultados = models.CharField(max_length=100)
    observacion = models.CharField(max_length=80)

Forms.py

class FormEnvIns(forms.ModelForm):
    
        proveedor= forms.ModelChoiceField(queryset=Proveedor.objects.filter(activo=True),
        widget=forms.Select(),required=True)
    
    
        producto=forms.ModelChoiceField(queryset=Producto.objects.filter(activo=True),
        widget=forms.Select(),label='Insumo')
    
        responsable=forms.ModelChoiceField(queryset=Empleado.objects.filter(activo=True),
        widget=forms.Select())
    
    
    
        class Meta:
            model = Recepcion_Envase_Insumo
            
            fields = [
            'fecha',
                'proveedor',
                'responsable',
                'cantidad',
                'deposito',
                'producto',
                'observaciones',
            ]
            
            labels = {
                'fecha':'Fecha de recepcion',
                'proveedor':'Proveedor',
                'responsable' : 'Responsable',
                'cantidad':'Cantidad recibida',
                'deposito':'Deposito',
                'producto':'MP',
            }
    
            widgets = {
                'fecha':forms.DateInput(attrs={'readonly':'readonly'}),
                'cantidad':forms.NumberInput(),
                'deposito':forms.TextInput({'class': 'form-control'}),
                'observaciones':forms.Textarea(attrs={'cols': 100, 'rows': 3}),
                
            }
    
    
    
     class FControlEnvIns(forms.ModelForm):
        
        parametro_env_ins=forms.ModelChoiceField(queryset=ParametroProducto.objects.all(),
        widget=forms.Select(),label='Parametros')
    
        class Meta:
            model = ControlEnvIns  
    
            fields = [
                'parametro_env_ins',
                'observacion', 
                'resultados',
                ]
            
            labels = {
                'observacion':'Observacion',
                'resultados':'Resultado ',
            }
    
    
            widgets = {
                'observacion':forms.TextInput(attrs={'class':'form-control'}),
                'resultados':forms.TextInput(attrs={'class':'form-control'}),
                
            }

View.py

def registro_envase_insumo(request):
    
    if request.method == 'POST':

        recepcion_form = FormEnvIns(request.POST)
        detalle_form = FControlEnvIns(request.POST)

        if recepcion_form.is_valid() and detalle_form.is_valid():
            envase_insumo  = recepcion_form.save(commit=False)

            producto_seleccionado = envase_insumo.producto

            parametros = producto_seleccionado.familia.parametro_familia.all()

            envase_insumo =  recepcion_form.save()      

            for parametro in parametros:
                envase_insumo_det = detalle_form.save(commit=False)
                envase_insumo_det.envase_insumo = envase_insumo
                envase_insumo_det.parametro_env_ins = parametro
                envase_insumo_det.save()
            

            messages.success(request,("Registrado Exitosamente"))
            return redirect('listar_recepcion') 
        else:

            messages.error(request,("Error, Verifique los campos"))
            for field_name, errors in envase_insumo.errors.items():
                for error in errors:
                    messages.error(request,f"Error en el campo {envase_insumo.fields[field_name].label} : {error}")
    else:
        recepcion_form = FormEnvIns()
        detalle_form = FControlEnvIns()

    return render(request, 'recepcion/envase_insumo_conj.html',{'env_ins_form': recepcion_form,'env_ins_det_form': detalle_form})

如何通过在产品字段的“FormEnvIns”表单中选择产品来获取模板中的参数列表,然后获取参数列表并将其显示在FControlEnvIns表单的parametro_env_ins字段中。这是我的观点,我不知道我是否走对了路。我意识到的是,我必须使用JavaScript,但我不知道如何才能做到这一点。FControlEnvIns表单和FormEnvIns表单必须只出现在模板中。

lvmkulzt

lvmkulzt1#

你需要的是向你的后端发送一个请求,检索你想要的数据,并更新DOM元素。正如你提到的,JS是用来实现这一点的。
一个新的视图,它不呈现页面,而只是返回你需要的数据:

from django.http import JsonResponse
from .models import Producto
import json

def registro_envase_insumo_product_params(request):
    data = json.loads(request.body)
    product = Producto.objects.get(pk=data['productId'])
    params = list(product.familia.parametro_familia.all().values())
    return JsonResponse(params, safe=False)

在前端。向product select box添加事件侦听器,将请求发送到后端,清除param select box并使用新数据重新填充它。还需要将csrf令牌附加到请求报头。

function getCookie(name) {
    ...
}

const productSelectElement = document.getElementById('id_producto');
const paramsSelectElement = document.getElementById('id_parametro_env_ins');

productSelectElement.addEventListener('change', async (event) => {
    const csrftoken = getCookie('csrftoken');
    const url = 'http://localhost:8000/insumo/product/params';
    const body = JSON.stringify({ productId: productSelectElement.value });

    try {
        const response = await fetch(url, {
            method: 'POST',
            headers: { 'X-CSRFToken': csrftoken },
            body: body
        });
        const data = await response.json();

        for (let i = paramsSelectElement.options.length; i >= 1; i--) {
            paramsSelectElement.remove(i);
        };

        data.forEach(param => {
            let opt = document.createElement('option');
            opt.value = param.id;
            opt.innerHTML = param.parametros_producto;
            paramsSelectElement.appendChild(opt);
        });
    } catch (error) {
        console.log('Something went wrong.')
    }
});

相关问题