CS 2340 · Objects & Design · Web Development with Django

GT Movies Store

A Django 5 full-stack storefront, built chapter by chapter and deployed live.

GT Movies Store — a full-stack web application I developed using Python, Django, HTML, CSS, Bootstrap, & SQLite; it provides users with an ability to search for and browse movies, create accounts, login, view movie details, write reviews, manage those reviews, report inappropriate content (reviews), use shopping cart features, make purchases & view past orders.

Python 3Django 5SQLiteHTML5 & CSS3Bootstrap 5PythonAnywhere

Model–View–Template

Models define movies, reviews and orders; views hold request logic; templates extend a shared base layout.

Django Authentication

Built-in auth handles registration, login, logout, password hashing and per-view access control.

Session-based cart

The cart lives in the request session, so browsing stays fast and no order rows are written until purchase.

Django Admin

Registered models give staff a full CRUD console for users, movies, reviews and orders out of the box.

What it does

Features, grouped by capability

Every major area of the app at a glance — from discovery to deployment.

Movie discovery

  • Responsive poster grid fed by Movie.objects.all()
  • Title search with case-insensitive icontains filtering
  • Detail page with description, price and add-to-cart form

Authentication

  • Registration via CustomUserCreationForm with server-side validation
  • Login/logout built on django.contrib.auth sessions
  • Navbar and views adapt to {% if user.is_authenticated %}

Reviews & reporting

  • Logged-in users create, read, edit and delete their own reviews
  • Ownership checks prevent editing others' reviews
  • Report flag queues inappropriate reviews for staff moderation

Session cart

  • Cart stored in request.session — no database writes until purchase
  • Add multiple titles, adjust quantities, remove rows or clear all
  • Running line totals and grand total computed in the view

Purchasing & orders

  • Checkout writes an Order plus Item rows in one request
  • Session cart is emptied only after the order succeeds
  • Orders page lists date, item breakdown and total spent

Administration

  • Every model registered in the Django admin console
  • Staff curate movies, users, reviews and orders without a deploy
  • Flagged-review queue supports moderation workflow

Responsive interface

  • Bootstrap 5 grid keeps pages readable from 360px upward
  • Collapsing navbar and fluid card columns on every screen

Deployment

  • Live on PythonAnywhere behind a configured WSGI entry point
  • ALLOWED_HOSTS, migrations and collectstatic handled at deploy time

Rubric requirement

Every user story, and the screen that answers it

The 21 required stories, grouped by area. Each card names the screen, the implementation behind it, and its status.

US-01Fully implemented

“As a visitor, I want to see information about the app so I understand what it offers.”

Screen · Home / About page

The Home template extends base.html and presents the GT Movies Store purpose, a hero banner and an About page describing the catalog, reviews and ordering features.

Accounts
US-02Fully implemented

“As a new user, I want to register for an account.”

Screen · Sign Up page

A Django CustomUserCreationForm renders styled fields with server-side validation; on success the user record is created and redirected to Login.

Accounts
US-03Fully implemented

“As a returning user, I want to log in and log out securely.”

Screen · Login / Logout

Built on django.contrib.auth with LoginView, session cookies and a logout POST action. The navbar swaps between Login/Sign Up and the username dropdown.

Accounts
US-04Fully implemented

“As a user, I want to view my account details.”

Screen · Account dropdown / Orders page

Authenticated templates use {% if user.is_authenticated %} to reveal the account menu linking to Cart and Order history.

Accounts
US-05Fully implemented

“As a shopper, I want to browse the full movie catalog.”

Screen · Movies list page

The movies.list view queries Movie.objects.all() and renders a responsive Bootstrap card grid with poster images, names and prices.

Catalog & Search
US-06Fully implemented

“As a shopper, I want to open a movie and see its details.”

Screen · Movie detail page

movies.show resolves the movie by primary key and shows poster, description, price, an add-to-cart quantity form and the review thread.

Catalog & Search
US-07Fully implemented

“As a shopper, I want to search movies by title.”

Screen · Movies list search bar

A GET form posts a search term handled with Movie.objects.filter(name__icontains=search), returning a filtered grid and an empty-state message.

Catalog & Search
US-08Fully implemented

“As a shopper, I want to add a movie to my cart.”

Screen · Movie detail → Add to cart

A POST writes {movie_id: quantity} into request.session['cart'], so the cart survives page navigation without a database write.

Cart & Orders
US-09Fully implemented

“As a shopper, I want to add several different movies to my cart.”

Screen · Cart page

The session dictionary accumulates multiple keys; the cart view rebuilds movie objects from those IDs and computes a running total.

Cart & Orders
US-10Fully implemented

“As a shopper, I want to view the items and total price in my cart.”

Screen · Cart page

A table lists each title, unit price, quantity and line total, with the grand total calculated in the view helper.

Cart & Orders
US-11Fully implemented

“As a shopper, I want to remove an item or clear the whole cart.”

Screen · Cart page controls

Per-row Remove buttons pop the movie key from the session cart; Clear cart resets it to an empty dict and redirects back.

Cart & Orders
US-12Fully implemented

“As a shopper, I want to purchase the items in my cart.”

Screen · Checkout confirmation

Purchase creates an Order plus Item rows inside a single request, empties the session cart and renders the order confirmation.

Cart & Orders
US-13Fully implemented

“As a user, I want to see my order history and what I spent.”

Screen · Orders page

Order.objects.filter(user=request.user) lists each order with date, item breakdown and total, giving a simple expense record.

Cart & Orders
US-14Fully implemented

“As a user, I want to write a review of a movie.”

Screen · Movie detail → Create review

A ReviewForm bound to the logged-in user and movie saves a Review with comment and date; anonymous users are prompted to log in.

Reviews & Moderation
US-15Fully implemented

“As a user, I want to read all reviews for a movie.”

Screen · Movie detail review list

Reviews are pulled through the movie's related manager and rendered newest-first with author and timestamp.

Reviews & Moderation
US-16Fully implemented

“As an author, I want to edit my own review.”

Screen · Edit review page

The edit view checks request.user == review.user before pre-filling the form, so users cannot alter reviews they did not write.

Reviews & Moderation
US-17Fully implemented

“As an author, I want to delete my own review.”

Screen · Delete review action

A guarded POST deletes the review and redirects to the movie detail page with the thread refreshed.

Reviews & Moderation
US-18Fully implemented

“As a user, I want to report an inappropriate review.”

Screen · Report review action

A report flag is recorded against the review so staff can review flagged content from the Django admin queue.

Reviews & Moderation
US-19Fully implemented

“As an administrator, I want to manage users, movies, reviews and orders.”

Screen · Django admin dashboard

Every model is registered in admin.py, giving staff full create, read, update and delete control behind an is_staff login.

Admin Suite
US-20Fully implemented

“As an administrator, I want to add or retire catalog items quickly.”

Screen · Admin → Movies

The Movie admin exposes name, price, description and image so the storefront can be curated without a code deploy.

Admin Suite
US-21Fully implemented

“As any user, I want the site to work on phone, tablet and desktop.”

Screen · Every page

Bootstrap's responsive grid, a collapsing navbar and fluid card columns keep layouts readable from 360px upward.

Responsive Design

How I worked

Process & methodology

An iterative, feature-at-a-time workflow — with a clear rule for what to do whenever I got stuck.

01

Structured iteration from the textbook

I followed Correa & Lim's Django 5 for the Impatient chapter by chapter, building one modular app at a time — home, movies, cart, accounts — and committing after each working feature rather than in one large push.

02

Mapping user stories to screens

Before writing a view I listed the user stories it had to satisfy, then checked each one off against the running site. That kept scope honest and made the final walkthrough straightforward.

03

Resolving questions with approved resources

When something broke I worked through the official Django documentation first, then Stack Overflow, GeeksforGeeks, W3Schools and the course discussion forum — all non-generative sources permitted by the assignment.

04

Deploying to PythonAnywhere

Deployment meant creating a virtual environment, pointing the WSGI file at the project, setting ALLOWED_HOSTS, running migrations and collecting static files with collectstatic before reloading the web app.

05

Keeping a video logbook

Each work session was screen-recorded through Microsoft Teams and stored on OneDrive, producing a timestamped record of the build for the process deliverable.

See it running

Video demonstration