2012-06-26 15 views
7

Sto provando a impostare un valore predefinito di campo in base ad un'altra selezione di campo che è esterna. In sostanza, queste sono le classi:Django imposta i valori dei campi dinamicamente in base ad altri campi

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') 

Ogni "prodotto" ha un prezzo predefinito (o prezzo suggerito), in modo che quando l'utente, in pagine di Admin, desidera aggiungere un nuova vendita e lui/lei scelgono un prodotto, ho bisogno di copiare dinamicamente da Product.price a Sell.price il prezzo suggerito. Non posso usare il metodo "salva" perché l'utente può cambiare in quel momento.

È necessario utilizzare JavaScript in modo esplicito? o C'è un modo elegante in Django per farlo?

risposta

3

È possibile affrontarlo con un gancio di pre-salvataggio o sovrascrivendo il metodo save() del modello di vendita.

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

E un altro modo è inizializzare il campo 'prezzo' nel metodo' clean() 'del modello. Molto simile all'override di 'save()' ma è più pulito a causa del fatto che non si deve chiamare 'super()' ed è un hook di framework progettato proprio per questo :) –

1

Stai chiedendo di aggiornare dinamicamente i valori dei campi modulo nella pagina Web di amministrazione? Il comportamento del modulo sul lato client deve avvenire in JavaScript. L'Admin di Django fornisce alcuni script in particolare per aggiungere/rimuovere Inline, ma non offre funzionalità a questo livello.

L'Admin di Django fornisce jQuery nel contesto della pagina window.django.jQuery (o solo django.jQuery). I moduli Django emettono sempre ID campo modulo stabile. Esamina il codice del modulo di output e trova il selettore Prodotti e il campo di input Sell.price corrispondente. Quindi puoi usare jQuery per fare qualcosa come aggiungere un gestore .change() o .on('change', ...) al selettore Prodotto con una funzione che aggiorna il prezzo nel campo Vendi.

Per riferimento futuro, Django Admin quasi soddisfa la tua richiesta con ModelAdmin.prepopulated_fields ma

prepopulated_fields non accetta campi DateTimeField, ForeignKey, nè ManyToManyField.

Problemi correlati