Одно поле в 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 в документации.