Django + Templates ~8 Hours Intermediate

What You Are Building

Build a server-rendered leave request system using Django models, forms, services, views, and templates.

This project teaches

  • Django models
  • Django forms
  • Service layer
  • Function-based or class-based views
  • Templates
  • 3-folder frontend structure
  • base.html
  • Data attributes
  • Status workflow
Flow Design

Status Workflow

stateDiagram-v2
    [*] --> Submitted
    Submitted --> Approved
    Submitted --> Rejected
    Submitted --> Cancelled
Flow Design

Example Flow

flowchart TD
    Login[User logs in]
    Workspace[Selects workspace]
    LeaveArea[Opens Leave Request Pages]

    Login --> Workspace --> LeaveArea

    LeaveArea --> Member[Member Flow]
    LeaveArea --> Admin[Admin Flow]
    LeaveArea --> Owner[Owner Flow]

    Member --> MemberList[View own leave requests]
    MemberList --> MemberFilter[Search / filter / paginate own requests]
    MemberFilter --> MemberCreate[Open create leave form]
    MemberCreate --> MemberSubmit[Submit leave request]
    MemberSubmit --> MemberTrack[Track status and decision]
    MemberTrack -. cannot approve own request .-> MemberBlocked[Approval actions blocked]

    Admin --> AdminQueue[View assigned workspace requests]
    AdminQueue --> AdminFilter[Search / filter / paginate by member, status, date]
    AdminFilter --> AdminDetail[Open request detail]
    AdminDetail --> AdminDecision[Approve or reject with reason]
    AdminDecision -. cannot review other workspaces .-> AdminBlocked[Blocked by workspace permission rules]

    Owner --> OwnerOverview[View leave requests across owned workspaces]
    OwnerOverview --> OwnerFilter[Filter by workspace, member, status, date]
    OwnerFilter --> OwnerDetail[Open request detail]
    OwnerDetail --> OwnerManage[Approve, reject, cancel, or audit request history]

Required Pages

My Leave Requests

Shows:

  • Request date, leave type, date range, duration, status, and available actions.
  • Search or quick filter by status.
  • Pagination if a user has a long request history.
  • View button for full request detail.
  • Cancel action only when the workflow allows it.
  • Empty state and Django message feedback after actions.

Create Leave Request

Fields:

  • Leave type, start date, end date, and reason.
  • Server-rendered validation messages next to invalid fields.
  • Submit button should be disabled during save when JavaScript enhancement is used.
  • Date summary so the user understands what will be submitted.

Leave Request Detail

Should show:

  • Full request information, current status, and timeline or decision summary.
  • Rejection reason if rejected.
  • Back link to the member request list.
  • Permission-safe access so one member cannot open another member’s request.

Admin Review Page

Shows:

  • Pending leave requests with user name, leave type, date range, and reason.
  • Search/filter by status or user where needed.
  • Pagination for larger workspaces.
  • View button before approve/reject.
  • Approve action and reject action with rejection reason capture.

Template Data Attributes

Use data attributes for JavaScript hooks instead of fragile class selectors.

Examples:

<button data-action="approve-leave" data-request-id="123">Approve</button>
<form data-form="leave-request"></form>
<div data-state="empty-leave-list"></div>

Permission Rules

ActorAllowed
OwnerManage all workspace leave requests.
AdminApprove/reject assigned workspace requests.
MemberCreate/view own requests.
Non-memberNo access.

Acceptance Checklist

  • base.html is used.
  • Templates are organized properly.
  • Business logic is in services, not directly in views.
  • Member can create leave request.
  • Admin can approve/reject only assigned workspace requests.
  • Member cannot approve own request.
  • Date validation works.
  • Django messages show success/error feedback.
  • Empty states are implemented.