我正在构建一个表单,用户(作曲家(可以在其中添加乐曲。在此表单中,除了标题、年份等外,他们还添加了仪器。
每种乐器都可以有几个属性,例如"加倍"和玩家数量。
因此,例如:
- 标题: 新作曲
- 仪表:
- 小提琴
- 双倍:否
- 玩家: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(你需要创建输入字段等(。