2016-08-21 32 views
8


Mam problem z ustawieniem domyślnej wartości pola. Co chcę robić?
Chcę tej ceny w klasie Pakiety to domyślna wartość priceNoTax w klasie Bill. Jak widać, wszystkie trzy klasy są logicznie połączone.
Przykład: Konto 1 ma pakiet o id 1. Cena tego pakietu wynosi 100. Domyślna wartość cenyNoTax dla Konta 1 to 100.

Jak to zrobić? Jestem na tym względnie nowy, więc potrzebuję pomocy.
Django - domyślna wartość pola zależy od innej wartości pola

models.py

class Packages(models.Model): 
    #other fields 
    price = models.IntegerField(validators=[MinValueValidator(1)], verbose_name="Price of package") 

class Account(models.Model): 
    startDate = models.DateField(verbose_name="Start date") 
    finishDate = models.DateField(verbose_name="Finish date") 
    idPackage = models.ForeignKey(Packages, on_delete=models.CASCADE, verbose_name="Package") 

class Bill(models.Model): 
    date = models.DateField(default=datetime.now()) 
    tax = models.FloatField(default=0.20) 
    priceNoTax = models.IntegerField() 
    priceTax = models.FloatField(default=priceNoTax+(priceNoTax*tax)) 
    idAccount = models.ForeignKey(Account, on_delete=models.CASCADE, verbose_name="Account") 

    def __str__(self): 
     return self.date 

dziękuję !!!

+0

W jaki sposób otrzymujesz informacje do modelu? Czy używasz strony administratora lub przekazujesz ją z innej lokalizacji? Sądzę, że można to zrobić na kilka sposobów, ale żaden z nich nie ustawił domyślnie atrybutu wartości z innego modelu. –

+0

Nie potrzebujesz pól 'priceNoTax' i' priceTax' dla mnie, ponieważ są * logicznie połączone już *. Możesz po prostu zapytać z klasy 'Bill', jeśli chcesz uzyskać dostęp do cen jako' Bill.objects.filter (idAccount__idPackage__price) '. Mniej zduplikowanych zmiennych. –

Odpowiedz

5

Może dodać to do swojej klasy Bill?

def save(self, *args, **kwargs): 
    if self.priceNoTax is None: 
     self.priceNoTax = self.idAccount.idPackage.price 
    super(Bill, self).save(*args, **kwargs) 
+0

służy do zapisywania, a nie do wartości domyślnej. – somenxavier

5

Dlaczego jest to pole? Czy widzisz powód, dla którego ktoś chciałby zmienić całkowitą cenę bez zmiany ceny i podatku na odpowiednie wartości? Jeśli tak naprawdę nie musi to być pole, możesz po prostu uczynić z niego metodę.

class Bill(models.Model): 
    date = models.DateField(default=datetime.now()) 
    tax = models.FloatField(default=0.20) 
    priceNoTax = models.IntegerField() 
    idAccount = models.ForeignKey(Account, on_delete=models.CASCADE, verbose_name="Account") 

    def priceTax(self): 
     return self.priceNoTax + (self.priceNoTax*self.tax) 

    def __str__(self): 
     return self.date 

Nadal można go używać w taki sam sposób w szablonach z {{ bill.priceTax }}. W kodzie musisz użyć bill.priceTax().

W ten sposób cena z podatkiem powinna pozostać aktualna, niezależnie od tego, w jaki sposób podatek lub cena bez zmian podatkowych. Można również użyć dekoratora @property.

@property 
def priceTax(self): 
    return self.priceNoTax + (self.priceNoTax*self.tax) 

uzyskać więcej zobacz https://docs.djangoproject.com/en/2.0/topics/db/models/#model-methods

-2

@kichik odpowiedział jak wyświetlić wartość domyślną przy użyciu szablon, i polecam do realizacji automatycznego obliczenia przez JavaScript.

Oczywiście trzeba będzie zweryfikować dane wprowadzane przez użytkownika lub zastosować metodę save() jako @ Curric Curvey.

+0

Wyświetlanie informacji nie jest problemem. https://docs.djangoproject.com/en/2.0/ref/models/fields/#default Wydaje się, że to właściwa odpowiedź. – wm3ndez