2012-06-26 26 views
7

Próbuję ustawić domyślną wartość pola na podstawie innego obranego pola wyboru. Zasadniczo są to zajęcia:Django dynamicznie ustawia wartości pól na podstawie innych pól

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

Każdy „produkt” ma swoją cenę domyślną (lub sugerowaną cenę), więc gdy użytkownik, na stronach administratora, chcemy dodać nową sprzedażą i on/ona Wybierz A produkt, muszę dynamicznie skopiować z Product.price do Sell.price sugerowaną cenę. Nie mogę użyć metody "zapisz", ponieważ użytkownik może zmienić w tym momencie.

Czy konieczne jest jawne użycie JavaScript? lub Czy istnieje elegancki sposób w Django, aby to zrobić?

Odpowiedz

3

Możesz temu zaradzić dzięki haczykowi przed zapisaniem lub przesłonięciu metody save() modelu Sell.

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

I innym sposobem jest zainicjować pole '' price' w czystym() 'metody modelu. Podobnie jak przesłonięcie 'save()', ale jest czystsze ze względu na to, że nie trzeba wywoływać 'super()' i jest to framework hook zaprojektowany specjalnie dla tego :) –

1

Pytasz o dynamicznie aktualizacji wartości pól formularza na stronie administracyjnej? Zachowanie formularza po stronie klienta musi wystąpić w JavaScript. Administrator Django zapewnia pewne skrypty, szczególnie do dodawania/usuwania Inlines, ale nie oferuje funkcjonalności na tym poziomie.

Admin Django ma zapewnić jQuery w kontekście widoku pod window.django.jQuery (lub po prostu django.jQuery). Django Forms zawsze wyprowadza stabilne identyfikatory pól formularza. Przeanalizuj kod formularza wyjściowego i znajdź selektor produktu oraz odpowiednie pole wejściowe Sell.price. Następnie możesz użyć jQuery, aby dodać coś takiego, jak dodanie do selektora produktów funkcji obsługi z funkcją aktualizującą cenę w polu Sprzedaj.

Na przyszłość, Django Admin prawie spełnia swoją prośbę wraz ModelAdmin.prepopulated_fields ale

prepopulated_fields nie akceptuje pola DateTimeField, ForeignKey, ani ManyToManyField.

Powiązane problemy