附加到一个字段的多个子字段,以及如何为用户提供添加其中许多字段的可能性



我正在构建一个表单,用户(作曲家(可以在其中添加乐曲。在此表单中,除了标题、年份等外,他们还添加了仪器。

每种乐器都可以有几个属性,例如"加倍"和玩家数量。

因此,例如:

  • 标题: 新作曲
    • 仪表:
      • 小提琴
        • 双倍:否
        • 玩家:1(这是"翻倍金额",请参阅模型(
      • 中提琴
        • 翻倍:是
        • 玩家:2(这是"翻倍金额",请参阅模型(
      • 大提琴
        • 双倍:否
        • 玩家:4(这是"翻倍金额",请参阅模型(

我创建了三种不同的模型:一种用于乐器,一种用于组合,然后通过"通过"具有 ManyToMany 关系。

models.py:

class Composition(models.Model):
title       = models.CharField(max_length=120) # max_length = required
INSTRUMENT_CHOICES = [('pno', 'piano'), ('vio1', 'violin_1(orchestral section)'), ('vio2', 'violin_2(orchestral section)'),]
instrumentation = models.ManyToManyField('Instrumentation',
through='DoublingAmount',
related_name='compositions',
max_length=10,
choices=INSTRUMENT_CHOICES,)
class Instrumentation(models.Model):
instrumentation = models.CharField(max_length=10)
class DoublingAmount(models.Model):
DOUBLING_CHOICES =[(1, '1'),(2, '2'), (3, '3')]
doubling = models.BooleanField(default=False)
composition = models.ForeignKey(Composition, related_name='doubling_amount', on_delete=models.SET_NULL, null=True)
instrumentation = models.ForeignKey(Instrumentation, related_name='doubling_amount', on_delete=models.SET_NULL, null=True)
amount = models.IntegerField(choices=DOUBLING_CHOICES, default=1)

forms.py:

from django import forms
from .models import Composition, Instrumentation
class CompositionForm(forms.ModelForm):
title       = forms.CharField(label='Title',
widget=forms.TextInput()
description = forms.CharField()

class Meta:
model = Composition
fields = [
'title',
'instrumentation',
]

views.py:

def composition_create_view(request):
form = CompositionForm(request.POST or None)
if form.is_valid():
form.save()
form = CompositionForm()
context = {
'form': form
}
return render(request, "template.html", context)

模板.html:

{{ form }}

我可以在我的表格中看到下拉列表,给出工具名称的选择,仅此而已。我希望可以选择仪器名称,将是/否和数量加倍。然后我还想添加更多工具,每个工具都有自己的名称、倍数和数量。我知道这必须通过JavaScript来完成,但我不知道如何构建"幕后"并让Django获取用户添加的新项目。

更新

我在 forms.py 中添加了一个新表单:

class InstrumentationForm(forms.ModelForm):
class Meta:
model = DoublingAmount
fields = [
'doubling',
'amount',
'instrumentation'
]

并链接到 views.py:

form_d = InstrumentationForm(request.POST or None)
[...]
context = {
'form': form,
'form_d': form_d
}

最后是模板:

{{ form_d }}

我现在在我的模板中显示了检测、倍增和金额字段。我这样做对吗?如果是,我如何让 Django 处理想要添加或删除工具的用户?谢谢。

更新 2

我刚刚意识到的问题是,如果我使用 DoublingAmount 模型来存储有关乐曲乐器的信息,则需要已经创建了对象合成,当然情况并非如此。一种解决方案可能是构建另一个表单,在用户保存乐曲标题后仅显示"倍增金额"(例如检测(信息。尽管如此,我不知道如何在 DoublingAmount 模型中拥有多个乐器,而没有多个 DoublingAmount 对象的对象用于相同的构图。

有没有更简单的方法来完成这一切?例如,组合模型的"子类"?

创建一个合成,然后在博客文章中添加一个又一个的乐器,如评论。这可能是最简单的方法。可悲的是,我不知道如何从 Django 中的表单创建对象数组。这是拥有多个对象的正确方法,这就是为什么它的ManyToMany。我还建议OneToMay和两节课: 带有字段的组成和乐器:名称,双倍,玩家计数。但我也没有真正理解这个音乐家的东西,所以也许我错了:-(

另一种方法是使用 Ajax 或类似的东西,并在 json 中创建一个数组并将其转换为您的工具。如果你想动态添加更多工具,无论如何都需要js(你需要创建输入字段等(。

最新更新