我正在构建一个表单,用户(作曲家)可以在其中添加一个组合。在这个表格中,除了标题、年份等,他们还添加了仪器。
每种乐器都可以有几个属性,例如“加倍”,以及玩家的数量。
因此,例如:
- viola
- doubled: yes
- players: 2 (this is the 'DoublingAmount', see the models)
- cello
- doubled: no
- players: 4 (this is the 'DoublingAmount', see the models)
我创建了三种不同的模型:一种用于仪器仪表,一种用于构图,另一种通过“通透”建立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)template.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模型中拥有多个工具,而不需要为相同的组合拥有多个DoublingAmount对象对象。
有更简单的方法来做这一切吗?例如,组合模型的“子类”?
发布于 2019-08-11 18:27:06
创建一篇作文,然后在博客上添加一个又一个类似评论的工具。那可能是最简单的方法。遗憾的是,我不知道如何从Django中的表单创建一个对象数组。这是拥有多个对象的正确方法,这就是为什么它的ManyToMany。我也会建议OneToMay和只有两个类别:构图和乐器的字段:名称,加倍,球员计数。但我也不太懂音乐人的东西,所以也许我错了-)
另一种方法是使用Ajax或诸如此类的东西,并在json中创建一个数组并将其转换为您的设备。如果您想动态地添加更多的工具(您需要创建输入字段等等),那么无论如何您都需要js。
https://stackoverflow.com/questions/57450725
复制相似问题