首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >附加在一个字段上的多个子字段,以及如何给用户添加这些字段的可能性。

附加在一个字段上的多个子字段,以及如何给用户添加这些字段的可能性。
EN

Stack Overflow用户
提问于 2019-08-11 14:19:13
回答 1查看 375关注 0票数 0

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

每种乐器都可以有几个属性,例如“加倍”,以及玩家的数量。

因此,例如:

  • 标题:新构图
    • 仪器仪表:
      • 小提琴
        • 加倍:不
        • 玩家:1(这是‘双峰’,见模型)

代码语言:javascript
复制
    - viola  
        - doubled: yes
        - players: 2 (this is the 'DoublingAmount', see the models)

代码语言:javascript
复制
    - cello  
        - doubled: no
        - players: 4 (this is the 'DoublingAmount', see the models)

我创建了三种不同的模型:一种用于仪器仪表,一种用于构图,另一种通过“通透”建立ManyToMany关系。

models.py:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
    {{ form }}

我可以看到我的表格中的下拉列表,给出了乐器名称的选择,只有这一点。我希望有可能选择乐器的名称,将是/否和数量加倍。然后,我还想增加更多的仪器,每一个都有自己的名字,加倍,数量。我知道这必须通过JavaScript完成,但我不知道如何构建“幕后”,让Django获取用户添加的新项目。

更新

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

代码语言:javascript
复制
class InstrumentationForm(forms.ModelForm):

    class Meta:
        model = DoublingAmount
        fields = [
            'doubling',
            'amount',
            'instrumentation'
        ]

并链接到views.py:

代码语言:javascript
复制
form_d = InstrumentationForm(request.POST or None)
    [...]
    context = {
        'form': form,
        'form_d': form_d
    }

最后,模板:

代码语言:javascript
复制
{{ form_d }}

我现在有了显示在模板中的工具、加倍和数量字段。我做得对吗?如果是,我如何让Django处理想要添加或删除工具的用户?谢谢。

更新2

我刚刚意识到的问题是,如果我使用DoublingAmount模型来存储有关构图仪器的信息,就需要已经创建了对象组合,这当然不是这样的。一种解决方案可能是构建另一个表单,其中只有'DoublingAmount‘(例如插装)信息将在用户保存完组合的标题后显示。尽管如此,我仍然不知道如何在DoublingAmount模型中拥有多个工具,而不需要为相同的组合拥有多个DoublingAmount对象对象。

有更简单的方法来做这一切吗?例如,组合模型的“子类”?

EN

回答 1

Stack Overflow用户

发布于 2019-08-11 18:27:06

创建一篇作文,然后在博客上添加一个又一个类似评论的工具。那可能是最简单的方法。遗憾的是,我不知道如何从Django中的表单创建一个对象数组。这是拥有多个对象的正确方法,这就是为什么它的ManyToMany。我也会建议OneToMay和只有两个类别:构图和乐器的字段:名称,加倍,球员计数。但我也不太懂音乐人的东西,所以也许我错了-)

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57450725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档