Отправка формы Django не запускает просмотр `create_cancel`Python

Программы на Python
Ответить
Anonymous
 Отправка формы Django не запускает просмотр `create_cancel`

Сообщение Anonymous »

Описание проблемы:
Я реализую функцию отмены заказа в своем приложении Django. Процесс включает в себя отображение формы отмены (

Код: Выделить всё

cancel-order.html
) с использованием представления cancel_order и обработки отправки формы с помощью представления create_cancel для обновления Product_status CartOrder и CartOrderItems.
Однако проблема в том, что представление create_cancel не запускается при отправке формы. Сообщения об успехе или ошибке не отображаются, а база данных не обновляется.
Просмотры:
Вот соответствующие представления:

Код: Выделить всё

def cancel_order(request, oid):
sub_category = SubCategory.objects.all()
categories = Category.objects.prefetch_related('subcategories').order_by('?')[:4]
wishlist = wishlist_model.objects.filter(user=request.user) if request.user.is_authenticated else None
nav_category = Category.objects.filter(special_category=True).prefetch_related('subcategories').order_by('?')[:4]
order = CartOrder.objects.get(user=request.user, id=oid)
products = CartOrderItems.objects.filter(order=order)

# Calculate discounts for each product
total_old_price = 0
total_price = 0

for item in products:
product = item.product  # Assuming a ForeignKey from CartOrderItems to Product
qty = item.qty  # Assuming a quantity field in CartOrderItems
total_old_price += (product.old_price or 0) * qty
total_price += (product.price or 0) * qty

# Calculate total discount percentage
if total_old_price > 0:  # Prevent division by zero
discount_percentage = ((total_old_price - total_price) / total_old_price) * 100
else:
discount_percentage = 0

context = {
"order": order,
"products": products,
"sub_category": sub_category,
"categories": categories,
"wishlist": wishlist,
"nav_category": nav_category,
"discount_percentage": round(discount_percentage, 2),  # Round to 2 decimal places
}

return render(request, 'core/cancel-order.html', context)

def create_cancel(request, oid):
if request.method == "POST":
user = request.user

# Fetch POST data
reason = request.POST.get('reason')
description = request.POST.get('description')

try:
# Fetch the CartOrder instance
order_cancel = get_object_or_404(CartOrder, id=oid, user=user)
order_cancel.product_status = "cancelled"
order_cancel.save()

# Fetch related CartOrderItems instances
order_items = CartOrderItems.objects.filter(order=order_cancel)
for item in order_items:
item.product_status = "cancelled"
item.save()

# Log the reason and description (if you want to save this somewhere)
# Example: save to a cancellation model (optional)
# CancellationReason.objects.create(order=order_cancel, reason=reason, description=description)

messages.success(request, "Order successfully cancelled.")

except Exception as e:
messages.error(request, f"An error occurred: {e}")

return redirect("core:dashboard")
else:
messages.error(request, "Invalid request method.")
return redirect("core:dashboard")
Шаблон:
Вот форма в шаблоне cancel-order.html:
< pre class="lang-html Prettyprint-override">

Код: Выделить всё

{% load static %}





[*]
Cancel Order

* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: Arial, sans-serif;
}

body {
background-color: #f8f9fa;
display: flex;
justify-content: center;
align-items: center;
align-items: flex-start;  /* Align items at the top to allow vertical scrolling */
min-height: 100vh;/* Ensure the body covers the viewport */
padding: 20px;
}

.cancel-order-container {
display: flex;
align-items: flex-start;
gap: 20px;
background: #ffffff;
width: 100%;
max-width: 800px;
padding: 30px;
border-radius: 8px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
}

.cancel-order-container img {
max-width: 150px;
height: auto;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}

.cancel-order-form {
flex: 1;
}

.cancel-order-form h2 {
margin-bottom: 20px;
color: #343a40;
}

.form-group {
margin-bottom: 15px;
}

.form-group label {
display: block;
margin-bottom: 5px;
color: #495057;
font-weight: bold;
}

.form-group input, .form-group select, .form-group textarea {
width: 100%;
padding: 10px;
border: 1px solid #ced4da;
border-radius: 4px;
font-size: 16px;
}

.form-group textarea {
resize: vertical;
min-height: 100px;
}

.form-actions {
text-align: right;
}

.btn {
display: inline-block;
padding: 10px 20px;
font-size: 16px;
border: none;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.3s ease;
}

.btn-cancel {
background-color: #dc3545;
color: #ffffff;
}

.btn-cancel:hover {
background-color: #c82333;
}

.btn-back {
background-color: #6c757d;
color: #ffffff;
margin-right: 10px;
}

.btn-back:hover {
background-color: #5a6268;
}

.modal {
display: none;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
justify-content: center;
align-items: center;
z-index: 1000;
}

.modal-content {
background: #ffffff;
padding: 20px;
border-radius: 8px;
text-align: center;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
}

.modal-content p {
margin-bottom: 20px;
font-size: 18px;
color: #343a40;
}

.modal-buttons {
display: flex;
justify-content: center;
gap: 10px;
}

@media (max-width: 576px) {
.cancel-order-container {
flex-direction: column;
align-items: center;
}

.cancel-order-container img {
max-width: 100%;
margin-bottom: 20px;
}

.cancel-order-form {
width: 100%;
}

.btn {
width: 100%;
margin-bottom: 10px;
}

.btn-back {
margin-right: 0;
}

.form-actions {
display: flex;
flex-direction:  column;
}
}


function showConfirmationModal(event) {
event.preventDefault();
const modal = document.getElementById('confirmation-modal');
modal.style.display = 'flex';
}

function hideModal() {
const modal = document.getElementById('confirmation-modal');
modal.style.display = 'none';
}

function confirmAndSubmit() {
document.querySelector('.cancel-order-form').submit();
}




[img]{{order.images}}[/img]

{% csrf_token %}
Cancel Your Order

Order Number


Product Name


Product Price


Product Old Price


{% if order.size %}

Product Size


{% endif %}


Reason for Cancellation

Select a reason
Order Delay
Changed My Mind
Found a Cheaper Option
Other


Additional Comments


Go Back
Submit







Are you sure to cancel the order? You are saving {{ discount_percentage }}% on this order.

No
Yes





Модели:
Вот модели CartOrder и CartOrderItems:

Код: Выделить всё

STATUS_CHOICE = (
("processing", "Processing"),
("shipped", "Shipped"),
("out_for_delivery", "Out for delivery"),
("delivered", "Delivered"),
("return_accepted", "Return Accepted"),
("pick_up", "Pick Up"),
("refund_completed", "Refund Completed"),
("cancelled", "Cancelled"),
)

class CartOrder(models.Model):
user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
oid = ShortUUIDField(length=10, max_length=100, prefix="oid", alphabet="1234567890")
product_status = models.CharField(max_length=50, choices=STATUS_CHOICE, default="processing")
# Other fields...

class CartOrderItems(models.Model):
order = models.ForeignKey(CartOrder, on_delete=models.CASCADE, related_name="items")
product = models.ForeignKey(Product, on_delete=models.CASCADE)
qty = models.PositiveIntegerField(default=1)
product_status = models.CharField(max_length=50, choices=STATUS_CHOICE, default="processing")
# Other fields...
URL-адреса:
Вот шаблоны URL-адресов:

Код: Выделить всё

path("cancel_order/", cancel_order, name="cancel_order"),
path("create_cancel/", create_cancel, name="create_cancel"),
Наблюдаемое поведение:
  • Форма cancel-order.html отображается правильно: URL-адрес действия указывает на представление create_cancel.
  • При отправке формы представление create_cancel не запускается.
  • Сообщения об успехе или ошибках не отображаются.
  • Поля Product_status в базе данных не изменяются.
Ожидаемое поведение:
При отправке формы должно активироваться представление create_cancel, и оно должно обновить поля Product_status для CartOrder и связанных с ним CartOrderItems. Сообщения об успехе или ошибке должны отображаться соответствующим образом.
Вопросы:
  • Что может быть причиной того, что представление create_cancel не срабатывает при отправке формы?
  • Есть ли какие-либо распространенные проблемы с отправкой формы или разрешением URL-адресов в Django, о которых я мог бы знать? упускать из виду?
  • Может ли это быть связано с тем, как Параметр oid передается в URL-адресе или как обрабатывается запрос POST?


Подробнее здесь: https://stackoverflow.com/questions/792 ... ancel-view
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»