我有一个很好的注册表格。它的一项功能是用户可以按“添加更多+”,并创建更多相同的“乐器”和“级别”选择字段。该模型仅保存第一个“仪器”和“级别”字段,而不保存从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);
}
答案 0 :(得分:0)
您正在寻找的是Django表单集,以便动态添加或删除表单。想想,一种形式的形式。这是Django的相关文档:https://docs.djangoproject.com/en/2.0/topics/forms/formsets/ 以及我用来理解和创建表单集的两个很好的教程:
答案 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)