Динамически обновлять модели - PullRequest
0 голосов
/ 27 июня 2018

У меня есть форма регистрации, которая прекрасно работает. Одной из его особенностей является то, что пользователи могут нажимать «Добавить больше +» и создавать более идентичные поля выбора «инструмент» и «уровень». Модель сохраняет только первое поле «инструмент» и «уровень», а не остальные, созданные из функции javascript. Как я могу настроить мою модель для создания дополнительных полей при вызове функции javascript? Я ценю любую помощь, которую я получаю.

models.py

class User(AbstractBaseUser):
    instrument = models.CharField(max_length=255, choices=instrument_list)
    level = models.CharField(max_length=255, choices=level_list)

HTML

<div>
    <div class="items">
        <div id="ins">
            <div>
                {{ form.instrument }}
            </div>

            <div>
                {{ form.level }}
            </div>
        </div>
    </div>


    <div id="add_more">
        <button type="button" class="no_link" onclick="add_instrument()">Add more +</button>
    </div>
</div>

Javascript

var i = 0;
var original = document.getElementById('ins');

function add_instrument() {
    var clone = original.cloneNode(true);
    clone.id = "ins" + ++i;
    original.parentNode.appendChild(clone);
}

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Ваша модель неверна. Если у пользователя может быть более одной пары инструмент / уровень (я предполагаю, что инструмент и уровень работают вместе), вам нужна отдельная модель "Инструмент" и отношение один ко многим:

class User(AbstractBaseUser):
    # remove instrument and level fields


class Instrument(models.Model):
    user = models.ForeignKey(User, related_name="instruments")
    instrument = models.CharField(max_length=255, choices=instrument_list)
    level = models.CharField(max_length=255, choices=level_list)

затем используйте набор форм, как объяснено в ответе Джорди Макнаб, чтобы позволить пользователю добавлять новые инструменты.

Примечание: на самом деле правильной реляционной моделью здесь будет модель Instrument и отношение «многие ко многим», оцениваемое уровнем пользователя для этого инструмента:

class User(AbstractBaseUser):
    # remove instrument and level fields


class Instrument(models.Model):
    instrument = models.CharField(max_length=255, choices=instrument_list, unique=True)


class UserInstrument(models.Model):
    user = models.ForeignKey(User, related_name="instruments")
    level = models.CharField(max_length=255, choices=level_list)
0 голосов
/ 27 июня 2018

Что вам нужно, так это наборы форм Django для динамического добавления или удаления форм. Подумайте, форма форм. Вот документация Джанго на это: https://docs.djangoproject.com/en/2.0/topics/forms/formsets/ А также два хороших урока, которые я использовал для понимания и создания набора форм:

  1. https://medium.com/@taranjeet/adding-forms-dynamically-to-a-django-formset-375f1090c2b0
  2. https://whoisnicoleharris.com/2015/01/06/implementing-django-formsets.html
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...