Django从预先创建的lis中选择项目和数量

2024-05-16 23:39:40 发布

您现在位置:Python中文网/ 问答频道 /正文

对于我认为是初学者的问题,我想不出一个合适的解决办法。非常感谢您的帮助。你知道吗

我正在建立的网站将用于计划聚会。有两种人会使用它,派对组织者和派对访客。 聚会组织者可以创建一个聚会并选择要提供给访客的项目。项目是食物和饮料,1个项目=一个比萨饼或一杯啤酒。你知道吗

然后,用户可以确认参加聚会,并选择他们想要点的食物和饮料以及数量。 我已经创建了身份验证和创建了一个参与方。你知道吗

现在,我的问题是:

  1. 组织者如何创建要提供给客户的项目列表 访客?你知道吗
  2. 访客如何选择物品类型和数量?你知道吗

我尝试了以下代码(精简):

型号.py:

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()

表单.py

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

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

视图.py

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。你知道吗


Tags: 项目namepyformmodelmodelsrequestparty
1条回答
网友
1楼 · 发布于 2024-05-16 23:39:40

在这种情况下,您需要与through模型建立多对多关系(order matters,或者更改order并引用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

相关问题 更多 >