Я сейчас создаю платформу электронной коммерции. Я работаю над частью заказа, которая создает заказ после того, как два человека согласились заключить сделку. Проблема в том, что модель заказа имеет много полей, и, как я хочу, чтобы мой шаблон выглядел по-разному в зависимости от многих значений, таких как; была произведена оплата? Товар был отправлен? возник спор? Я также хочу, чтобы страница выглядела по-разному в зависимости от того, просматривает ли ее страница покупатель или продавец. Очевидно, что если продавец просматривает страницу, я не хочу, чтобы он видел кнопку «Оформить заказ», или покупатель видит товар, отмеченный как отправленный и т. Д. c.
Так что в настоящее время у меня есть эта работа, однако есть много из операторов if в моем шаблоне, чтобы сделать это, и представление имеет много логики c. Мой вопрос заключается в том, есть ли лучший (более эффективный и быстрый) способ сделать это, так как я знаю, что большинство logi c должны быть исключены из шаблона. Если это не замедлит работу моего сайта, тогда это приемлемо, но если это так, мне действительно нужно его изменить.
Код модели:
class Order(models.Model):
created = models.DateField(auto_now_add=True)
updated = models.DateField(auto_now=True)
offer = models.OneToOneField(Offer, on_delete=models.CASCADE)
advert = models.OneToOneField(Advert, on_delete=models.CASCADE)
buyer = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='order_buyer')
seller = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='order_seller')
price = models.DecimalField(max_digits=10, decimal_places=2)
payment_received = models.BooleanField(default=False)
shipped = models.BooleanField(default=False)
receipt = models.ImageField(upload_to='media/', blank=True, null=True)
pending = models.BooleanField(default=True)
completed = models.BooleanField(default=False)
active = models.BooleanField(default=True)
disputed = models.BooleanField(default=False)
canceled = models.BooleanField(default=False)
Вид:
@login_required
@permission_required_or_403('orders.view_article', (Order, 'pk', 'pk') )
def orderdetail(request, pk, *args, **kwargs):
order = get_object_or_404(Order, pk=pk)
seller = order.seller
buyer = order.buyer
user = request.user
shipped = order.shipped
completed = order.completed
pending = order.pending
disputed = order.disputed
mark_shipped_form = OrderShippedForm(request.POST or None, request.FILES or None, instance=order)
mark_complete_form = OrderMarkedCompleteForm(request.POST or None, instance=order)
if request.method == 'POST':
if not order.shipped:
#Form to mark order as shipped
if mark_shipped_form.is_valid():
mark_shipped_form.save()
messages.success(request, 'Congradulations on your purchase. Please proceed to leave feedback for the seller.')
#Signal for Notification sending
notify.send(sender=seller, recipient=buyer, verb='marked your order as shipped',
action_object=order, level='success', public=False, email=buyer.email)
return HttpResponseRedirect(reverse("order_detail", kwargs={
'pk': order.pk}))
#Form to mark order as shipped
if not order.completed :
if mark_complete_form.is_valid():
mark_complete_form.instance.pending = False
mark_complete_form.instance.active = False
mark_complete_form.save()
messages.success(request, 'Order marked as complete')
#Signal for notification marking order complete
notify.send(sender=buyer, recipient=seller, verb='Congradulations, on your sale. Please proceed to leave feedback for the buyer',
action_object=order, level='success', public=False, email=seller.email)
return HttpResponseRedirect(reverse("order_detail", kwargs={
'pk': order.pk}))
else:
mark_shipped_form = OrderShippedForm(instance=order)
context = {'order' : order, 'seller' : seller, 'buyer' : buyer, 'user' : user, 'shipped' : shipped, 'pending' : pending, 'disputed' : disputed, 'mark_shipped_form' : mark_shipped_form,
'mark_complete_form' : mark_complete_form, 'completed' : completed}
template = 'orders/order_detail.html'
return render(request, template, context)
шаблон:
{% if order.advert.image %}
Order for: {{order.advert.title}},
<img class="product_image" src="{{ order.advert.image.url }}" >
{% else %}
<img class="product_image" src="{% static 'images/default.png' %}"></a>
{% endif %}
Date created : {{order.date}},
Last Updated :{{order.updated}},
Buyer : {{order.buyer}},
Seller : {{order.seller}},
Price : ${{order.price}},
{% if not completed %}
{% if order.payment_received %}
Payment for this order has been made.
{% if order.shipped %}
This order has been marked as shipped
{% else %}
This order is awaiting shipping
{% endif %}
{% if order.receipt %}
<img class="product_image" src="{{ order.receipt.url }}" >
{% endif %}
{% else %}
Payment pending.
{% endif %}
{% endif %}
{% if not completed %}
{% if buyer == user%}
<a class="btn btn-primary" href="{% url 'message_user' pk=order.advert.pk %}">Message {{order.seller}}</a>
{% if not order.payment_received %}
<a class="btn btn-success" href="#">Check Out</a>
{% endif %}
{% else %}
<a class="btn btn-primary" href="{% url 'message_user' pk=order.advert.pk %}">Message {{order.buyer}}</a>
{% endif %}
{% endif %}
{% if pending %}
This order is pending.
{% endif %}
{% if completed %}
This order has been marked as completed on {{order.updated}}.
{% endif %}
{% if disputed %}
This order has had a disputed filed, it is under review.
{% endif %}
</p>
{% if not disputed%}
{% if user == seller and shipped == False %}
{% if order.payment_received %}
<p>Upload postage receipts and mark the order as shipped below</p>
<div class="post-form">
<form method="POST" class='from-group' enctype="multipart/form-data" >
{% csrf_token %}
{{ mark_shipped_form|crispy }}
<button class="btn btn-success" type="submit">Update</button>
</form>
</div>
{% endif %}
{% endif %}
{% endif %}
{% if not disputed %}
<a class="btn btn-warning" href="{% url 'order_dispute' pk=order.pk %}" >File Dispute</a>
{% else %}
<p>A dispute has been filed for this order, if you have any corresponding information or documentation to support your claim please email them to disputes@foxlisted.com.au using this
order number as a referance.</p>
{% endif %}
{% if not disputed %}
{% if order.payment_received %}
{% if user == buyer and completed == False %}
<p>Mark this order as completed</p>
<div class="post-form">
<form method="POST" class='from-group' >
{% csrf_token %}
{{ mark_complete_form|crispy }}
<button class="btn btn-success" type="submit">Update</button>
</form>
</div>
{% endif %}
{% endif %}
{% endif %}
<a class="btn btn-primary" href="{% url 'order_list' %}">Back to orders</a>
{% endblock %}