2012-06-26 6 views
7

Estoy tratando de establecer un valor predeterminado de campo basado en otra selección de campo que sea ajena. Básicamente, estas son las clases:Django establece valores de campo dinámicamente en función de otros campos

class Product(models.Model): 
     description = models.CharField('Description', max_length=200) 
     price = models.FloatField('Price') 

class Sell(models.Model): 
     product = models.ForeignKey(Product) 
     price = models.FloatField('Price') 

Cada "producto" tiene un precio predeterminado (o precio sugerido), de modo que cuando el usuario, en las páginas de administración, desea añadir una nueva venta y él/ella elige una producto, necesito copiar dinámicamente de Product.price a Sell.price el precio sugerido. No puedo usar el método "guardar" porque el usuario puede cambiar en ese momento.

¿Es necesario usar JavaScript explícitamente? o ¿Hay una forma elegante en Django para hacer eso?

Respuesta

3

Puede abordar esto con un gancho guardado previamente o anulando el método save() del modelo Vender.

from django.db import models 

class Product(models.Model): 
    description = models.CharField('Description', max_length=200) 
    price = models.FloatField('Price') 

class Sell(models.Model): 
    product = models.ForeignKey(Product) 
    price = models.FloatField('Price') 

    # One way to do it: 
    from django.db.models.signals import post_save 
    def default_subject(sender, instance, using): 
     instance.price = instance.product.price 
    pre_save.connect(default_subject, sender=Sell) 

    # Another way to do it: 
    def save(self, *args, **kwargs): 
     self.price = self.product.price 
     super(Sell, self).save(*args, **kwargs) 
+1

Y otra forma es inicializar el campo 'price' en el método' clean() 'del modelo. Al igual que anula 'save()' pero es más limpio debido a que no tiene que llamar a 'super()' y es un gancho de framework diseñado solo para esto :) –

1

¿Está preguntando sobre la actualización dinámica de los valores del campo de formulario en la página web del administrador? El comportamiento del formulario del lado del cliente debe ocurrir en JavaScript. El administrador de Django proporciona algunas secuencias de comandos particularmente para agregar/eliminar líneas, pero no ofrece funcionalidad en este nivel.

Administrador de Django proporciona jQuery en el contexto de la página en window.django.jQuery (o simplemente django.jQuery). Django Forms siempre genera ID de campo de formulario estable. Examine el código de formulario de salida y encuentre el selector de Producto y el campo de entrada Sell.price correspondiente. Luego puede usar jQuery para hacer algo así como agregar un controlador .change() o .on('change', ...) al selector de Producto con una función que actualiza el precio en el campo Vender.

Para referencia futura, Django administración casi cumple su petición con ModelAdmin.prepopulated_fields pero

prepopulated_fields no acepta campos DateTimeField, ForeignKey, ni ManyToManyField.

Cuestiones relacionadas