STAY INFORMED
following content serves as a personal note and may lack complete accuracy or certainty.

Minimal-Mistakes instruction
Useful vscode Shortcut Keys
Unix Commands
npm Commands
Vim Commands
Git Note
Useful Figma Shortcut Keys

1 minute read

E-Commerce Website Project_1 E-Commerce Website Project_2 E-Commerce Website Project_3 E-Commerce Website Project_5

Handle Items in Cart

I made three buttons for adding item, removing item, deleting all items.

<a href="{% url 'increase-quantity' item.item.id %}"><button>+</button></a>
<a href="{% url 'decrease-quantity' item.item.id %}"><button>-</button></a>
<a href="{% url 'remove-item' item.item.id %}"><button>x</button></a>

And the functions be like

# views.py

@login_required
def increase_quantity(request, item_id):
    cart = get_object_or_404(Cart, user=request.user)
    cart_item = get_object_or_404(CartItem, cart=cart, item_id=item_id)
    cart_item.quantity += 1
    cart_item.save()
    return redirect('cart-list')

@login_required
def decrease_quantity(request, item_id):
    cart = get_object_or_404(Cart, user=request.user)
    cart_item = get_object_or_404(CartItem, cart=cart, item_id=item_id)
    if cart_item.quantity > 1:
        cart_item.quantity -= 1
        cart_item.save()
    else:
        cart_item.delete()
    return redirect('cart-list')

@login_required
def remove_item(request, item_id):
    cart = get_object_or_404(Cart, user=request.user)
    cart_item = get_object_or_404(CartItem, cart=cart, item_id=item_id)
    cart_item.delete()
    return redirect('cart-list')

des1

Payment

Setup

I use Strip which offers many features and offers payment solutions that can scale from small to large businesses.

To use this, install the package.

pip install stripe django

and set API key in settings.py so it will be like env file. You can find the keys on your dashboard.

STRIPE_PUBLISHABLE_KEY = os.getenv("STRIPE_PUBLISHABLE_KEY", "your-publishable-key")
STRIPE_SECRET_KEY = os.getenv("STRIPE_SECRET_KEY", "your-secret-key")

And create the form.

class PaymentForm(forms.Form):
    name_on_card = forms.CharField(max_length=100, label="Name on Card")
    card_number = forms.CharField(max_length=16, label="Card Number")
    expiry_month = forms.CharField(max_length=2, label="Expiry Month (MM)")
    expiry_year = forms.CharField(max_length=4, label="Expiry Year (YYYY)")
    cvc = forms.CharField(max_length=4, label="CVC")

View

import stripe
from django.conf import settings

stripe.api_key = settings.STRIPE_SECRET_KEY

def process_payment(request, order_id):
    order = get_object_or_404(Order, id=order_id)

    if request.method == 'POST':
        form = PaymentForm(request.POST)
        if form.is_valid():
            token = request.POST.get('stripeToken')
            try:
                charge = stripe.Charge.create(
                    amount=int(order.get_total_price() * 100), 설정
                    currency='usd',
                    description=f'Order {order.id}',
                    source=token,
                )

                order.is_paid = True
                order.paymentId = charge['id']
                order.save()

                # delete cartItems
                user_cart = Cart.objects.get(user=request.user)
                user_cart.cart_items.all().delete()

                return redirect('payment_success')

            except stripe.error.CardError as e:

                return redirect('payment_failed')

    else:
        form = PaymentForm()

    return render(request, 'forms/process_payment.html', {'form': form, 'order': order})

And you need success.html and failed.html. Lastly, add

from django.views.generic import TemplateView
path('payment/<int:order_id>', views.process_payment, name='process_payment'),
    path('payment/success/', TemplateView.as_view(template_name="success.html"), name='payment_success'),
    path('payment/failed/', TemplateView.as_view(template_name="failed.html"), name='payment_failed'),

you can test with these arguments.

Widget Tweaks

Django provides built-in support for login and signup functionality, but to design the pages, you need ‘widget_tweaks’ which lets you customize Django form fields directly in templates.

pip install django-widget-tweaks
INSTALLED_APPS = [
    ...
    'widget_tweaks',
]

Now you can customize login, signup pages. ```html {% load widget_tweaks %} … {{ form.login|add_class:”cp-input”|attr:”placeholder:email”|add_error_class:”error”}} …