Django, как внедрить формфактор в структуру моей модели? - PullRequest
0 голосов
/ 02 мая 2020

У меня к вам следующий вопрос. У меня есть четыре модели: Informazioni generali, Lavorazione, Costi_materiale и Mod. Первые два дают мне возможность зарегистрировать «codice_commesse» и «Numberro_lavorazione» следующим образом:

class Informazioni_Generali(models.Model):
    codice_commessa= models.CharField()
    CATEGORY_CHOICES=(
    ('BOZZA', 'BOZZA'),
    ('PREVENTIVO', 'PREVENTIVO'),
    ('COMMESSA', 'COMMESSA')
    )
    status=models.CharField(choices=CATEGORY_CHOICES)
    nome_cliente=models.CharField()


class Lavorazione(models.Model):
    codice_commessa=models.ForeignKey(Informazioni_Generali)
    numero_lavorazione=models.IntegerField()
    prodotto=models.ForeignKey()
    sottoprodotto=models.ForeignKey()
    note=models.CharField()

После регистрации этих двух моделей клиент имеет возможность зарегистрировать Costi_materiale и Mod, связанные с Lavorazione (сам по себе). связанные с Informazioni generali).

class Costi_materiale(models.Model):
    codice_commessa=models.ForeignKey(Informazioni_Generali, on_delete=models.CASCADE, null=True)
    numero_lavorazione=models.ForeignKey(Lavorazione)
    conto = models.ForeignKey(Conto)
    tipologia = models.ForeignKey(Tipologia)
    sottocategoria = models.ForeignKey(Sottocategoria)
    quantita=models.DecimalField()
    prezzo=models.DecimalField()


class Mod(models.Model):
    codice_commessa=models.ForeignKey(Informazioni_Generali, on_delete=models.CASCADE, null=True)
    numero_lavorazione=models.ForeignKey(Lavorazione, on_delete=models.CASCADE, null=True)
    nome_cognome=models.CharField(')
    costo_orario=models.DecimalField()
    monte_ore=models.DecimalField()

Я создал модельные формы для Informazioni_generali и Lavorazioni, но у меня есть проблемы с реализацией формы для последних двух моделей. Я хочу иметь следующую структуру, но я не знаю, как ее реализовать. Я хочу заполнить только один раз "codice_commessa" и "numero_lavorazioni" для всех связанных моделей (Costi_materiale и Mod). И я хочу дать возможность пользователю добавить новую форму, нажав на кнопку "+" . У вас есть предложения?

ango

1 Ответ

0 голосов
/ 03 мая 2020

Добро пожаловать в stackoverflow! Необходимо понимать, что каждая форма имеет имя, относящееся к ее входам. Например:

<input type="text" name="input1">

Атрибут ввода name позволяет представлению (бэкэнду) обрабатывать каждый ввод отдельно внутри POST или GET запрос. Но имя должно быть уникальным.

Если name для двух входов одинаковое, вы получите MUltiKeyError.

Вы можете достичь того, что хотите, но для что вам придется обрабатывать дополнительные входные данные самостоятельно, а Образцовая форма не сделает этого за вас. Прежде всего вам нужно сгенерировать поля ввода, которые можно сделать с помощью Javascript.

Внутри уже существующего тега формы у вас есть кнопка +, присоедините к ней атрибут onclick, например:

<form id="DynamicForm">  
     <button onclick="AddInput()"></button>
</form>

Также укажите свой атрибут form и id, чтобы получить его в Javascript.

В прикрепленном скрипте или теге Inline Script вы можете добавить JS код, подобный этому:

<script>
        var counter = 0;
     function AddInput(){
       let h = '<input type="text" name="input'+counter+'">';
       var d = document.getElementById('DynamicForm');
       d.insertadjacenthtml('beforeend',h);
       counter = counter+1;
    }
 </script>

Затем вам нужно получить доступ к этим полям ввода, которые вы можете сделать, используя:

    ....
    if request.method == 'POST':
       form = ModelFormName(request.POST)
       if form.is_valid():
          data = form.cleaned_data['input1']
       else:
           #FormInvalid Error 
    else:
        #NotValid Request Method
    ....

Теперь вы можете узнать, сколько входов добавил пользователь, для этого вы можете использовать тот же счетчик переменной и добавьте еще один вход с именем new_input_len со значением, установленным на самое высокое значение, достигнутое счетчиком. Затем используйте это входное значение, чтобы выполнить итерацию для l oop в вашем бэкэнде и получить доступ ко всем добавленным входам.

...