Skip to content
Switch branches/tags
Go to file

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

please hire me

A Django app for building an online portfolio and resume.

The goal for this app is to enable the creation of an integrated portfolio/resume website that connects your projects with your jobs and education to tell the story of your career in a more holistic way than either a portfolio or resume can do on its own.

When built out, it should also generate a more traditionally printable (PDF) and plaintext version of the resume from the data contained on the site, to eliminate the redundant labor of creating these documents manually.

For now, the frontend templates are intentionally unfinished; because it arose from a community of UX designers, the aim of this app is to serve as a flexible backend for a variety of frontend designs, showcasing the design skills of its users rather than supporting a collection of cookie-cutter portfolio sites.


  • finalize models
  • update with final models
  • create views for portfolio, project, resume, context
  • allow many-to-many relationships from projects to roles
  • implement tagging system for projects and roles
  • build up a template collection for different display options (especially aggregating roles by org in resume)

Unresolved questions:

  • "Context" and "Block" are confusing names. Propose "Role" and "Section" as replacements.
  • Resume frontend should support a wide variety of combinations and groupings (e.g., many jobs, one org). As long as these don't require data beyond our models, OK to handle this in the view/template layer?
  • Implement tagging feature?

Data model

ER diagram


Contact and social media information. For a portfolio/site with a single user, this will probably only have one row.


  • HeaderID: primary key
  • Name: user's name, as it will appear on site and resume
  • AddressStreet: street address, including unit number
  • AddressCityStateZip: city, state, and postal abbreviation as formatted on resume
  • Phone: phone number, as formatted on resume
  • Email: email address
  • Website: URL, excluding "http://"
  • LinkedIn: URL, excluding "http://"
  • Twitter: user handle without "at" symbol (e.g., "TwitterUser" or "twitteruser", not "@twitteruser")
  • Other: catchall for whatever else you want to include


A section can be standalone text (e.g., an 'Objective', a list of 'Skills' or 'Publications', etc.) or they can be a container for a "collection" of Roles (e.g., an 'Education' section would include schools, 'Experience' would have jobs, etc.).


  • SectionID: primary key
  • HeaderID: foreign key to Header
  • Name: title of the section, as it will appear on site and resume
  • Order: integer indicating order within resume
  • Roles: foreign keys to Roles to be collected in this section, if any
  • Summary: additional text or html content to be displayed in this section


Roles are jobs, degree programs, volunteer positions and other occupations that make up your career history. They serve a dual function.

  1. Roles can be linked to zero or more Projects. This link is bi-directional: the Projects serve as examples of your work in that Role, and the Role provides additional context for that Project.
  2. Roles can be displayed in your resume by collecting them into one or more of the Sections that make up your resume.


  • RoleID: primary key
  • Name: job title, degree program, or other position name
  • Slug: URL-friendly Name
  • Order: integer indicating order within Section
  • Organization: institution where position was held or degree was obtained
  • StartDate: approximate start date of role (YYYY-MM-DD)
  • EndDate: approximate end date of role (YYYY-MM-DD)
  • Location: location of role (e.g., "San Francisco, CA")
  • Summary: short text description
  • LongDescription: long text description


Projects are items in your portfolio. They must exist within a Role, and can include zero or more Details, which are text bullets or multimedia items.


  • ProjectID: primary key
  • RoleID: foreign key to Role
  • Name: project title
  • Slug: URL-friendly Name
  • Order: integer indicating order within Role
  • Date: approximate completion date of project (YYYY-MM-DD)
  • Summary: short text description
  • IndexImage: uploaded image to appear on project list page
  • LongDescription: long text description


Details are text bullets or multimedia items (photo/video) that can be attached to a Project to provide a fuller description of the Project.


  • DetailID: primary key
  • ProjectID: foreign key to Project
  • Name: title of detail, if any (this might be the alt text for an image)
  • Order: integer indicating order within Project
  • Description: text description
  • Type: type of detail (enumerated: "Text", "Image", "Video")
  • URL: excluding "http://"


Zero or more tags can be attached to Roles, Projects, or Details as desired.


  • TagID: primary key
  • Value: the text of the tag (e.g., "infoviz", "UX", "peer-reviewed", "pro bono")
  • FKType: type of object being tagged (enumerated: "Role", "Project", "Detail")
  • FKID: ID of object being tagged (foreign key to RoleID, ProjectID, or DetailID)

Your resume consists of a Resume Header followed by one or more Resume Sections. Descriptions follow.

Testing Models

I've found it instructive so far to map the resume model to actual resumes to discover potential issues and better ways to adapt and abstract the model so it can support a wider range of frontend resume designs.

Below are some (anonymized) examples, feel free to add your own.

Model: Resume

resume resume resume resume

Model: Role

context context context context


  • Python 2.7x
  • Django 1.5x

###django app dependencies

  • django-embed-video
  • django-grappelli


django app for creating an online portfolio and resume




No releases published


No packages published