动态更新模型

时间:2018-06-27 01:29:21

标签: javascript python django model

我有一个很好的注册表格。它的一项功能是用户可以按“添加更多+”,并创建更多相同的“乐器”和“级别”选择字段。该模型仅保存第一个“仪器”和“级别”字段,而不保存从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 :(得分:0)

您正在寻找的是Django表单集,以便动态添加或删除表单。想想,一种形式的形式。这是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

答案 1 :(得分:0)

您的模型是错误的。如果用户可以有多个乐器/水平对(我假设仪器和水平可以一起工作),则您需要一个独特的“乐器”模型和一对多关系:

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)

然后使用乔迪·麦克纳布(Jordy Mcnab)的答案中所述的表单集,允许用户添加新乐器。

NB:实际上,这里合适的关系模型应该是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)