Django - 从预先创建的列表中选择项目和数量

问题描述 投票:0回答:1

对于我认为是初学者问题,我无法找到合适的解决方案。任何帮助都非常感谢。

我正在建设的网站将用于计划聚会。两种类型的人将使用它,派对组织者和派对访客。派对组织者可以创建派对并选择要提供给访问者的项目。物品是食物和饮料,1件=一份披萨或一份啤酒。

然后,用户将能够确认参加聚会并选择他们想要订购的食品和饮料以及订购的数量。我已经创建了一个身份验证和创建聚会。

现在,我的问题是:

  1. 组织者如何创建要提供给访问者的项目列表?
  2. 访客如何选择项目类型和数量?

我尝试使用以下代码(修剪):

models.朋友:

class ItemType(models.Model):
    """Create items (food and drinks)."""
    name = models.CharField()

class Party(models.Model):
    """Create a party."""
    organizer = models.ForeignKey(User)
    party_name = models.CharField()
    items_to_be_offered = models.ManyToManyField(ItemType)

class PartyRegistration(models.Model):
    """Register for a party / create party registration."""
    party = models.ForeignKey(Party)
    visitor = models.CharField()
    selected_items = models.ManyToManyField()

class ItemSelection(models.Model):
    """Specify which items and number of items the visitor selected."""
    party_registration = models.OneToOneField(PartyRegistration)
    item_type = models.ManyToManyField(ItemType)
    item_quantity = models.PositiveIntegerField()

forms.朋友

class VisitorRegisterForm(forms.ModelForm):
    """Form to register a visitor."""

    class Meta:
        model = PartyRegistration
        fields = ['visitor', 'selected_items']

views.朋友

def VisitorRegister(request, pk):
    """Register Visitor to a specific party."""    
    party = get_object_or_404(Party, pk=pk)    

    if request.method == 'POST':
        form = VisitorRegisterForm(request.POST)
        if form.is_valid():
            name_clean = form.cleaned_data['visitor']
            registration = PartyRegistration(party=party, visitor=name_clean)
            registration.save()
            return HttpResponseRedirect(reverse('index'))
    else:
        form = VisitorRegisterForm()

    context = {'form': form, 'party': party}

    return render(request, 'visitor-register.html', context)

网站是Django 2.0,PostgreSQL。

python django django-models django-forms
1个回答
0
投票

在这种情况下,您需要与through模型建立ManyToMany关系(订单很重要,或更改订单并引用PartyRegistration):

class PartyRegistration(models.Model):
    """Register for a party / create party registration."""
    party = models.ForeignKey(Party)
    visitor = models.CharField()
    selected_items = models.ManyToManyField(ItemType, through='ItemSelection')

class ItemSelection(models.Model):
    """Specify which items and number of items the visitor selected."""
    party_registration = models.ForeignKey(PartyRegistration)
    item_type = models.ForeignKey(ItemType)
    item_quantity = models.PositiveIntegerField(default=1)

    class Meta:
        unique_together = ('party_registration', 'item_type')

https://docs.djangoproject.com/en/2.1/topics/db/models/#intermediary-manytomany

© www.soinside.com 2019 - 2024. All rights reserved.