Одно поле в Django не может получить правильное значение при отображении в шаблоне

models.py

class Order(models.Model):
    PAYMENT_OPTIONS = (
        ('VISA','VISA'),
        ('Master','Master'),
        ('Octopus','Octopus'),
        ('Cash','Cash'),
    )
    STATUS = (
        ('Pending','Pending'),
        ('Delivered','Delivered'),
        ('Collected','Collected'),
    )
    METHODS = (
        ('外賣自取','外賣自取'),
        ('送遞','送遞'),
    )
    user = models.ForeignKey(User,models.CASCADE,null=True,blank=True)
    customer = models.CharField(max_length=200,null=True,blank=True)
    card_id = models.IntegerField(null=True,blank=True)
    mobile = models.IntegerField(null=True,blank=True)
    email = models.CharField(max_length=200,null=True,blank=True)
    total_price = models.DecimalField(decimal_places=2,max_digits=7)
    payment_method = models.CharField(max_length=50,choices=PAYMENT_OPTIONS,null=True,blank=True)
    status = models.CharField(max_length=50,choices=STATUS,default='Pending')
    take_method = models.CharField(max_length=50,choices=METHODS,null=True,blank=True)
    points_earned = models.IntegerField(default=0)
    date = models.DateTimeField(auto_now_add=True)
    address = models.CharField(max_length=350,null=True,blank=True)

    def __str__(self):
        return str(self.customer)+'\'s Order'

views.py

def checkout(request):
    global cartlist
    cartlist1 = cartlist
    total = 0
    for unit in cartlist:
        total += int(unit[3])
    grandtotal = total + 100
    earnings = int(grandtotal/5)
    print(grandtotal)
    if request.method == 'POST':
        print(type(request.POST.get('customerPayment')))
        print(request.POST.get('customerPayment'))
        print(request.POST.get('customerTakeaway'))
        customerName = request.POST.get('customerName','')
        customerID = request.POST.get('customerID','')
        customerMobile = request.POST.get('customerMobile','')
        customerEmail = request.POST.get('customerEmail','')
        customerPayment = request.POST.get('customerPayment'),
        customerTakeaway = request.POST.get('customerTakeaway'),
        customerAddress = request.POST.get('customerAddress','')
        new_order = Order.objects.create(
                user = User.objects.get(username=request.user),
                customer = customerName,
                card_id = customerID,
                mobile = customerMobile,
                email = customerEmail,
                total_price = grandtotal,
                payment_method = customerPayment,
                take_method = customerTakeaway,
                points_earned = earnings,
                address = customerAddress)
        account = User.objects.get(username=request.user)

checkout.html

<tr>
                        <td style="width:160px;text-align:center;">
                            <strong>付款方式</strong>
                        </td>
                        <td style="width:200px;text-align:center;">
                            <input type="radio" name="customerPayment" value="VISA" id="customerPayment">VISA
                            <input type="radio" name="customerPayment" value="Master" id="customerPayment">Master<br>
                            <input type="radio" name="customerPayment" value="Octopus" id="customerPayment">Octopus
                            <input type="radio" name="customerPayment" value="Cash" id="customerPayment">Cash
                        </td>
                    </tr>
                    <tr>
                        <td style="width:160px;text-align:center;">
                            <strong>領取方式</strong>
                        </td>
                        <td style="width:200px;text-align:center;">
                            <input type="radio" name="customerTakeaway" value="外賣自取" id="customerTakeaway">外賣自取
                            <input type="radio" name="customerTakeaway" value="送遞" id="customerTakeaway">送遞
                            
                        </td>
                    </tr>

order_summary.html

<tr>
                    <td style="width:160px;text-align:center;">
                        <strong>付款方式</strong>
                    </td>
                    <td style="width:200px;text-align:center;">
                        {{ customer_order.payment_method }}
                    </td>
                </tr>
                <tr>
                    <td style="width:160px;text-align:center;">
                        <strong>領取方式</strong>
                    </td>
                    <td style="width:200px;text-align:center;">
                        {{ customer_order.take_method }}
                    </td>
                </tr>

Когда я пытаюсь отправить форму в методе checkout, так как у меня есть модель Order, имеющая CharFields с вариантами выбора, и я использовал request.POST.get(field_name), то есть radiobutton из HTML. После того, как я отправил форму, {{ customer_order.payment_method }} показал ('VISA',) вместо правильного значения VISA и запись в базе данных не смогла обновиться. Может ли кто-нибудь помочь мне выяснить проблему?

Вы не используете ни встроенную в Django валидацию форм, ни даже форму на странице оформления заказа (если только она не была отрезана в вставленном вами фрагменте).

Обычно у вас есть <form method="post"></form> с маркером csrf и входами в качестве дочерних элементов, как минимум.

Смотрите Часть 4 официального учебника Django для примера этого.

Кроме того, ваши радиовходы должны быть обозначены должным образом:

<input type="radio" name="customerPayment" value="VISA" id="customerPayment">
<label for="customerPayment">VISA</label>

Возможно, это влияет на то, как данные поста отправляются на сервер.

В качестве альтернативы вы можете использовать сами формы Django для создания формы с помощью кода на Python. Это добавляет встроенную валидацию, о которой я упоминал ранее. Он также предлагает ChoiceField, которое создано специально для выбора модели и обрабатывает валидацию за вас.

Затем инстанцируйте несвязанную форму и передайте ее в представление как контекст, если метод запроса - get.

А в вашем представлении, если метод post, проверьте валидность формы с помощью form.is_valid() и необязательной дополнительной очистки значений с помощью form.cleaned_data.

Рекомендую прочитать далее об основах форм Django в документации.

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