Django - выбор предметов и количества из предварительно созданного списка - PullRequest
0 голосов
/ 07 марта 2019

Я не могу найти подходящее решение для того, что я считаю проблемой для начинающих. Любая помощь высоко ценится.

Сайт, который я создаю, будет использоваться для планирования вечеринок. Его будут использовать два типа людей: организаторы вечеринок и посетители вечеринок. Организаторы вечеринок могут создавать вечеринки и выбирать предметы, которые будут предлагаться посетителям. Предметы - еда и напитки, 1 предмет = одна пицца или одно пиво.

Пользователи смогут подтвердить участие в вечеринке и выбрать, какую еду и напитки они хотели бы заказать и сколько. Я уже создал аутентификацию и создание партии.

Теперь мои проблемы таковы:

  1. Как организатор может создать список предметов, которые будут предложены Посетитель
  2. Как посетитель может выбрать и тип товара и количество?

Я пробовал использовать следующий код (обрезанный):

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

forms.py

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

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

views.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.

1 Ответ

0 голосов
/ 07 марта 2019

В этом случае вам понадобятся отношения ManyToMany с моделью through (заказ имеет значение или измените заказ и укажите 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

...