【问题标题】:Dynamically update models动态更新模型
【发布时间】:2018-12-05 19:01:02
【问题描述】:

我有一个很好用的注册表单。它的一个特点是用户可以按“添加更多+”并创建更多相同的“工具”和“级别”选择字段。该模型仅保存第一个“仪器”和“级别”字段,而不是从 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);
}

【问题讨论】:

  • 仅在 DOM 中创建新字段是不够的,您需要创建可提交的表单,每个请求都在控制器中单独或迭代地使用某种表单字段计数和然后保存值。检查这个类似的帖子:stackoverflow.com/questions/5478432/…

标签: javascript python django model


【解决方案1】:

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

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 的回答中解释的表单集,以允许用户添加新仪器。

注意:实际上,这里正确的关系模型是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)

【讨论】:

    【解决方案2】:

    您正在寻找的是 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

    【讨论】:

      猜你喜欢
      • 2016-02-22
      • 2019-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-05
      • 2015-04-30
      • 2011-01-15
      • 2012-06-25
      相关资源
      最近更新 更多