Выберите конкретную опцию из выпадающего меню DJANGO

У меня есть страница, на которой перечислены все товары из таблицы под названием Stocks, для каждой строки есть нажимаемая кнопка ORDER, которая ведет пользователей на другую страницу, где они могут ввести все свои данные, а также выбрать, какой товар и за сколько они хотят купить, которая затем сохранит все эти данные в таблице под названием Orders.

Эта таблица заказов связана с таблицей Stocks следующим образом:

class Order(models.Model):
    name = models.CharField(max_length=50, blank=True, null=True)
    quantity = models.IntegerField(default='0', blank=False, null=True)
    order_item = models.ForeignKey(Stock, on_delete=models.CASCADE, blank=True)
    address = models.CharField(max_length=50, blank=True, null=True)
    city = models.CharField(max_length=50, blank=True, null=True)

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

def create_order(request, pk):
    queryset = Stock.objects.get(id=pk)
    form = CreateOrderForm(request.POST or None, initial={'order_item':queryset.item_name})
    if form.is_valid():
        form.save()
    context = {
        'form':form
    }
    return render(request, 'add_items.html', context)

Я пытался сделать это с помощью команды intitial, но по какой-то причине она просто не меняется с пустой опции по умолчанию.

Вот мой forms.py на всякий случай

class CreateOrderForm(forms.ModelForm):
    class Meta:
        model = Order
        fields = ['name','quantity','order_item','address','city']

В качестве начального значения используется объект Stock, поэтому не queryset.item_name, а queryset (хотя, поскольку это не кверисет, лучше переименовать его в stock):

from django.shortcuts import get_object_or_404

def create_order(request, pk):
    stock = get_object_or_404(Stock, id=pk)
    if request.method == 'POST':
        form = CreateOrderForm(request.POST, initial={'order_item': stock})
        if form.is_valid():
            form.save()
    else:
        form = CreateOrderForm(initial={'order_item': stock})
    context = {
        'form':form
    }
    return render(request, 'add_items.html', context)

Примечание: Часто лучше использовать get_object_or_404(…) [Django-doc], чем использовать .get(…) [Django-doc] напрямую. В случае, если объект не существует, например, потому что пользователь сам изменил URL, get_object_or_404(…) приведет к возврату ответа HTTP 404 Not Found, в то время как использование .get(…) приведет к ответу HTTP 500 Server Error.

Вернуться на верх