Много полета и изчислена стойност

Имам нужда от решение за този проблем:

Бих искал да имам притурка MultiField за поле „стойност“. Това поле трябва да позволява въвеждането на две стойности (два уиджета за въвеждане) и потребителят трябва да избере коя от тези стойности да бъде запазена (два уиджета в полето за отметка). Една от тези стойности обаче трябва да бъде преизчислена по отношение на стойността на друго поле.

Възприех този подход: MultiValueField с 4 полета:

class PriceDetailField(MultiValueField):
    use_net = BooleanField(required=False)
    net_value = DecimalField(required=False, decimal_places=2)
    use_gross = BooleanField(required=False)
    gross_value = DecimalField(required=False, decimal_places=2)

MultiWidget:

class PriceDetailWidget(MultiWidget):
    use_net = CheckboxInput()
    net_value_widget = TextInput()
    use_gross = CheckboxInput()
    gross_value_widget = TextInput()

и персонализирана форма...

class PriceModelForm(ModelForm):
    value = PriceDetailField()

... което замества формата на модела по подразбиране за модел:

class Price(models.Model):
    value = models.DecimalField(
        max_digits=19,
        decimal_places=2,
        default=Decimal(0),
        )

Това решение обаче изглежда объркано. Във формуляра трябва да въведа всички подполета (подполетата MultiValueField), в противен случай се появява грешка „Моля, въведете стойност“ (въпреки че тези полета са маркирани като required=False). Освен това трябва да преизчисля споменатата стойност при запазване, след като върнах кортеж от полето с информация кое квадратче за отметка е отметнато и съответната текстова стойност, след което заменя кортежа с десетичната стойност в clean_value метода на формуляра (също запазване на квадратчетата за отметка състояние във временни полета....). Мисля, че такъв дизайн е много слаб.

Формулярът трябва да работи както самостоятелно, така и като вграден (това означава, че стойността на полето, което се използва за изчисляване на върнатата стойност, може или не може да се промени по време на запис).

Възможно ли е изобщо такова нещо?


И коренът на проблема: искам да съхранявам цените на артикулите като нетни цени, но бих искал да позволя на потребителите да ги въвеждат като нетни или брутни цени и след това да преизчислят брутната цена към нетната цена по отношение на нивото на ДДС на продукта ( тъй като ДДС се начислява на продукт или услуга, а не на цената). Един продукт може да има много цени, така че цената е обратно свързана с продукта чрез външен ключ.

Наздраве, Томек


person tomek    schedule 07.09.2011    source източник


Отговори (1)


Функцията, която търсите на MultiValueField (позволяваща подполетата да бъдат задължителни или не поотделно) се регистрира като заявка за функция на Django.

Вероятно бихте могли да поправите това засега, като подкласирате MultiValueField с пренаписан clean метод въз основа на оригинала и следните предложения от доклада за грешка. Все пак няма да имате много от оригиналния MultiValueField, останал до този момент, и ако го направите, трябва да изпратите корекцията си на Django и да поставите бележка за грешката.

Пренебрегвайки за момент необходимостта, написали ли сте метод compress на вашия PriceDetailField? Как изглежда? Това е мястото, където трябва да вършите работата, за да превърнете вашите четири подполета в едно поле за запазване.

person Duncan Parkes    schedule 07.09.2011
comment
Преминах през чистия метод MultiValueField и разбрах, че той извиква компресиране. И така, всичко, което трябваше да се направи, беше правилно да се приложи методът за компресиране. Сега той връща изчислен десетичен знак (тъй като свързах целия формуляр с полето при конструирането, така че мога да получа достъп до полето, което е необходимо за изчисляване на стойността на полето на MVF), хвърля ValidationError (ако комбинацията от подполета е незаконна) или връща None . Също така трябваше да внедря отново метода _has_changed на MultiWidget. Във формуляра не се поддържа логика на полето, с изключение на препратката към полето на формуляра. - person tomek; 08.09.2011
comment
Можете ли, моля, да посочите как подполетата на MultiValueField могат да бъдат достъпни в шаблона поотделно? - person Cloud Artisans; 19.08.2013