Photography Blog is a dynamic web application created for photography enthusiasts who wish to showcase their work and connect with a community of like-minded individuals. This platform allows users to upload their photos, categorize them, and engage with others through comments and likes. Whether you’re an amateur photographer or a seasoned professional, the Photography Blog offers a space to share your visual stories with the world.
View the live project here: Photography Blog
Here's deployed site: Am I Responsive
Photography Blog is a web application designed for photographers to share their work with a community. Users can upload photos, categorize them, leave comments, and interact with others by liking photos. The project emphasizes a user-friendly interface with responsive design, making it accessible on both desktop and mobile devices.
The primary goals for the development of the Photography Blog are:
For users, the Photography Blog aims to fulfill the following goals:
Photography is a powerful medium for storytelling, yet existing platforms often fail to provide photographers with the tailored experience they need. General social media sites overwhelm quality content with sheer volume, making it difficult for photographers to stand out and connect meaningfully with their audience.
Photographers face several challenges on current platforms:
To address these challenges, the Photography Blog must:
This platform is designed for:
The Entity-Relationship Diagram (ERD) representing the relationships between the User, Category, Photo and Comment models.
The goal of this project is to create a seamless and enjoyable user experience for amateur photographers. The blog is designed to be intuitive, visually appealing, and functional, ensuring users can easily navigate the site, upload their work, and engage with the community.
and more. Link to the Kanban board here
This project was organized and executed using Agile methodology. A Kanban board within GitHub Projects was utilized to track progress and manage tasks, ensuring a structured and iterative development process. Link to the Kanban board here
The design of the Photography Blog is modern and minimalist, with a focus on showcasing high-quality images. The layout is clean and simple, with ample whitespace to create a visually appealing experience for users. The color scheme is a combination of neutral tones, with accents of blue to evoke a sense of creativity and inspiration.
Navigation Bar: The navigation bar is placed at the top of the page, providing easy access to the main sections of the blog, including Home, Blog, About, Contact and user-specific options like My Photo List and Logout.
Responsive Bahavior:
Header Image:
The header image spans the full width of the screen and adjusts its height based on the viewport. It serves as a visually engaging introduction to the site.
Implementation:
Welcome Section:
Lens Image:
Action Button:
The blog page showcases a collection of photography posts, organized into categories like Landscape, Portrait, Wildlife, Street, and Macro.
Layout:
Responsive Design:
Interactive Elements:
Each category page presents a curated selection of photography posts focused on a specific theme, allowing users to explore content based on their interests.
Layout:
Responsive Design:
Interactive Elements:
Category-Specific Content:
Photo Management Features:
The "Add Photo" page is an essential feature of the Photography Blog, allowing users to contribute their own photography to the site. This page is only accessible to logged-in users. The key features of the "Add Photo" page include:
Photo Upload: Users can easily upload their photos by selecting a file from their device. The photo will be stored and displayed on the blog, categorized according to the user's choice.
Title and Description: Along with the photo, users are required to provide a title and a description. The title helps in identifying the photo, while the description allows the user to share the story or context behind the image.
Category Selection: Users can categorize their photos by choosing from predefined categories such as Landscape, Portrait, Wildlife, Street, and Macro. This helps in organizing the photos within the blog and aids in easy navigation for viewers.
Form Validation: The form on the "Add Photo" page includes validation to ensure all required fields are filled out correctly. If any issues are detected, the user is prompted to correct them before submission.
Success Page The success.html page is a dedicated confirmation page displayed after a user successfully uploads a photo to their portfolio. The page is designed with user experience in mind, featuring a clean and centered card that conveys the success message. The card header, styled in green, signals the successful upload with the message "Photo Uploaded Successfully!" Users are informed that their photo is now visible in their portfolio. Additionally, the page provides easy navigation with buttons allowing users to either view their photos or upload another one.
Key Features:
The "My Photo List" page is a personalized feature for logged-in users, providing them with a dedicated space to manage their uploaded photos. This page displays all the photos a user has uploaded to the Photography Blog. The key features of the "My Photo List" page include:
Personal Photo Gallery: Users can view a gallery of all the photos they have uploaded. Each photo is displayed with its title and a brief description, offering a quick overview of the user's contributions to the blog.
View, Edit, Delete Options: For each photo in the gallery, users have the following options:
View: Opens the detailed view of the photo, allowing the user to see it in full size along with all associated comments and likes.
Edit: Allows the user to modify the title, description, or even replace the photo. This is useful for updating content or correcting any mistakes.
Delete: Provides the option to remove the photo from the blog. A confirmation prompt ensures that users do not accidentally delete their content.
Pagination: The photo list is paginated to ensure that the page remains easy to navigate, even for users with a large number of uploads. Users can easily navigate between pages to view all their photos.
Responsive Design: The "My Photo List" page is designed to be fully responsive, ensuring a seamless experience across different devices, including desktops, tablets, and mobile phones.
This page serves as a personal management tool, giving users full control over their uploaded content on the Photography Blog. It encourages users to maintain and curate their gallery, contributing to the overall quality and organization of the site.
The View Page displays detailed information about a specific photo, including its title, description, and the photographer's username. Key features include:
The Edit Page allows users to modify the details of their uploaded photos. Key features include:
The Delete Page allows users to permanently remove their uploaded photos. Key features include:
The About Us page provides visitors with insights into the mission and vision of the Photography Blog. Key elements include:
The Contact Us page is designed to facilitate communication between visitors and the Photography Blog team. Key features include:
The Sign Up page allows new users to create an account on the Photography Blog. It includes a simple and user-friendly form where users can enter their desired username, email, and password. Upon successful registration, users are automatically logged in and redirected to the homepage. A success message is displayed to welcome the new user.
The Login page provides a secure way for returning users to access their accounts on the Photography Blog. The page features a straightforward form where users can enter their username and password. After a successful login, users are redirected to the homepage.
The Photography Blog includes custom error pages to enhance user experience when something goes wrong. These pages ensure that even in the case of errors, users receive clear and helpful feedback. The custom error pages include:
400 Bad Request: This page appears when the server cannot process the request due to a client error, such as a malformed request syntax. It provides a simple, clear explanation and a link to navigate back to the homepage.
403 Forbidden: This page is shown when a user tries to access a resource they do not have permission to view. It clearly explains the issue and encourages the user to contact the site administrator if they believe this is an error.
404 Not Found: This page is displayed when a user attempts to access a page that doesn't exist. It provides a friendly message, suggesting that the user may have mistyped the URL or clicked on a broken link. The page includes a button to redirect users back to the homepage.
500 Internal Server Error: In the event of a server issue, this page informs the user that something went wrong on the server side. It suggests trying again later and includes a link to return to the homepage.
The design choices were influenced by the need to create a platform that is easy to navigate and visually appealing. The use of a minimalist layout and neutral color scheme allows the focus to be on the photography, while the accents of blue add a touch of personality to the design.
The colors used in the design are:
The fonts used in your project are:
Arial, sans-serif: This is the main font used throughout your CSS for body text and headings. It's a widely used, clean, and highly readable font that is supported across all browsers and devices.
Page | Wireframes | Pass |
---|---|---|
About Us | Screenshot of result |
:white_check_mark: |
Add Photo | Screenshot of result |
:white_check_mark: |
Blog | Screenshot of result |
:white_check_mark: |
Contact Us | Screenshot of result |
:white_check_mark: |
Homepage | Screenshot of result |
:white_check_mark: |
Landscape | Screenshot of result |
:white_check_mark: |
Login | Screenshot of result |
:white_check_mark: |
Macro | Screenshot of result |
:white_check_mark: |
Photo List | Screenshot of result |
:white_check_mark: |
Portrait | Screenshot of result |
:white_check_mark: |
Sign Up | Screenshot of result |
:white_check_mark: |
Street | Screenshot of result |
:white_check_mark: |
Wildlife | Screenshot of result |
:white_check_mark: |
Success | Screenshot of result |
:white_check_mark: |
Page | Wireframes | Pass |
---|---|---|
About Us | Screenshot of result |
:white_check_mark: |
Add Photo | Screenshot of result |
:white_check_mark: |
Blog | Screenshot of result |
:white_check_mark: |
Contact Us | Screenshot of result |
:white_check_mark: |
Homepage | Screenshot of result |
:white_check_mark: |
Landscape | Screenshot of result |
:white_check_mark: |
Login | Screenshot of result |
:white_check_mark: |
Macro | Screenshot of result |
:white_check_mark: |
Photo List | Screenshot of result |
:white_check_mark: |
Portrait | Screenshot of result |
:white_check_mark: |
Sign Up | Screenshot of result |
:white_check_mark: |
Street | Screenshot of result |
:white_check_mark: |
Wildlife | Screenshot of result |
:white_check_mark: |
Success | Screenshot of result |
:white_check_mark: |
ll pages were validated, and the code was pasted in. A filter was applied to remove issues related to the Django templating system.
Tested | Result | View Result | Pass |
---|---|---|---|
base | No errors | Screenshot of result |
:white_check_mark: |
about | No errors | Screenshot of result |
:white_check_mark: |
add photo | No errors | Screenshot of result |
:white_check_mark: |
blog | No errors | Screenshot of result |
:white_check_mark: |
confirm delete | No errors | Screenshot of result |
:white_check_mark: |
contact | No errors | Screenshot of result |
:white_check_mark: |
edit photo | No errors | Screenshot of result |
:white_check_mark: |
homepage | No errors | Screenshot of result |
:white_check_mark: |
landscape | No errors | Screenshot of result |
:white_check_mark: |
marco | No errors | Screenshot of result |
:white_check_mark: |
photo detail | No errors | Screenshot of result |
:white_check_mark: |
photo list | No errors | Screenshot of result |
:white_check_mark: |
portrait | No errors | Screenshot of result |
:white_check_mark: |
search results | No errors | Screenshot of result |
:white_check_mark: |
street | No errors | Screenshot of result |
:white_check_mark: |
wildlife | No errors | Screenshot of result![Result]() |
:white_check_mark: |
Tested | Result | View Result | Pass |
---|---|---|---|
styles.css | No errors | Screenshot of result |
:white_check_mark: |
Tested | Result | View Result | Pass |
---|---|---|---|
admin.py | No errors | Screenshot of result |
:white_check_mark: |
apps.py | No errors | Screenshot of result |
:white_check_mark: |
forms.py | No errors | Screenshot of result |
:white_check_mark: |
models.py | No errors | Screenshot of result |
:white_check_mark: |
url.py | No errors | Screenshot of result |
:white_check_mark: |
views.py | No errors | Screenshot of result |
:white_check_mark: |
Tested | Result | View Result | Pass |
---|---|---|---|
script.js | No errors | Screenshot of result |
:white_check_mark: |
I used Google PageSpeed Insights to evaluate the accessibility of our website on both mobile and desktop platforms. PageSpeed Insights provides a score out of 100 for accessibility, which measures how well the content of the web pages is accessible to all users, including those with disabilities.
Tested | Result | View Result | Pass |
---|---|---|---|
Homepages | 89 | Screenshot of result |
:white_check_mark: |
Blog page | 84 | Screenshot of result |
:white_check_mark: |
Landscape page | 84 | Screenshot of result |
:white_check_mark: |
Portrait page | 84 | Screenshot of result |
:white_check_mark: |
Wildlife page | 88 | Screenshot of result |
:white_check_mark: |
Street page | 88 | Screenshot of result |
:white_check_mark: |
Macro page | 84 | Screenshot of result |
:white_check_mark: |
About Us page | 89 | Screenshot of result |
:white_check_mark: |
Contact page | 88 | Screenshot of result |
:white_check_mark: |
Login page | 88 | Screenshot of result |
:white_check_mark: |
Signup page | 88 | Screenshot of result |
:white_check_mark: |
Tested | Result | View Result | Pass |
---|---|---|---|
Homepages | 100 | Screenshot of result |
:white_check_mark: |
Blog page | 89 | Screenshot of result |
:white_check_mark: |
Landscape page | 89 | Screenshot of result |
:white_check_mark: |
Portrait page | 89 | Screenshot of result |
:white_check_mark: |
Wildlife page | 94 | Screenshot of result |
:white_check_mark: |
Street page | 94 | Screenshot of result |
:white_check_mark: |
Macro page | 89 | Screenshot of result |
:white_check_mark: |
About Us page | 100 | Screenshot of result |
:white_check_mark: |
Contact page | 100 | Screenshot of result |
:white_check_mark: |
Login page | 100 | Screenshot of result |
:white_check_mark: |
Signup page | 100 | Screenshot of result |
:white_check_mark: |
Consistent High Scores: The accessibility scores are consistently high across both mobile and desktop platforms, indicating that the site is well-optimized for accessibility on different devices.
Responsive Design: The website's design adapts well to both mobile and desktop screens, ensuring that content remains accessible and usable regardless of the device being used.
Color Contrast: All text elements meet the recommended contrast ratio, ensuring that text is easily readable against background colors on both mobile and desktop devices. This is crucial for users with visual impairments.
Alt Text for Images: All images include descriptive alt attributes, allowing screen readers to convey the purpose of images to users who are visually impaired, on both mobile and desktop.
Keyboard Navigation: The site is fully navigable using a keyboard, which is essential for users with motor disabilities who cannot use a mouse. Interactive elements like links, buttons, and forms are easily accessible via keyboard on both platforms.
Form Labels: All forms, such as those on the Contact Us page, have associated labels, making it clear to screen reader users what information is required on both mobile and desktop.
ARIA Landmarks: Appropriate ARIA (Accessible Rich Internet Applications) landmarks are used to help assistive technologies understand the structure of the page and navigate through sections effectively on both devices.
While the overall accessibility scores are high, there are a few areas where improvements could be made:
Interactive Element States: Ensuring that all interactive elements, such as buttons and links, have visible focus states that are easy to identify when using a keyboard, especially on mobile where touch interactions are more common.
Language Attributes: Ensuring that the lang attribute is correctly set on all pages to help screen readers determine the correct language of the content on both mobile and desktop.
Form Validation: Enhancing client-side form validation with more descriptive error messages that are accessible to screen readers, particularly in mobile environments where screen space is limited.
Skip Navigation Links: Adding "skip to content" links to allow keyboard users to bypass repetitive navigation menus and jump directly to the main content, which is especially helpful on mobile where screen size is smaller.
HTML: Used for structuring the content on the web pages. It forms the backbone of the project, ensuring that all elements are correctly placed and accessible.
CSS: Used for styling the HTML elements, providing the visual appearance and layout of the web pages. CSS ensures the platform is visually appealing and user-friendly.
JavaScript: Adds interactivity and dynamic behavior to the web pages. It enhances the user experience by allowing for real-time updates, form validations, and interactive elements.
Python: a primary programming language for the backend of the project. It is used in conjunction with the Django framework to handle server-side logic, data processing, and integration with the database.
Django Purpose: A high-level Python web framework that encourages rapid development and clean, pragmatic design. Use Case: Used for building the backend, managing databases, handling user authentication, and rendering templates.
Bootstrap Purpose: A popular front-end framework for developing responsive, mobile-first websites. Use Case: Used for styling the website, creating responsive layouts, and ensuring a consistent design across devices.
Cloudinary API Purpose: A cloud-based image and video management service. Use Case: Used for handling image uploads, storage, and optimization, ensuring fast and reliable content delivery.
Pillow Purpose: A Python Imaging Library that adds image processing capabilities to your Python interpreter. Use Case: Used to manage and process image uploads, including resizing and format conversions.
JavaScript Purpose: A programming language that enables dynamic content on web pages. Use Case: Used for front-end interactions such as the search bar functionality, dropdowns, and form validations.
GitHub Purpose: A platform for version control and collaborative development. Use Case: Used to host the project repository, manage version control with Git, and collaborate through issues and pull requests.
JQuery Purpose: A fast, small, and feature-rich JavaScript library. Use Case: Used to simplify HTML document traversal and manipulation, event handling, and animation.
SQLite Purpose: A lightweight, disk-based database that doesn’t require a separate server process. Use Case: Used as the database for storing all application data during development.
Chrome DevTools Purpose: A set of web developer tools built directly into the Google Chrome browser. Use Case: Used for debugging JavaScript, analyzing runtime performance, and optimizing website responsiveness.
Balsamiq Purpose: A wireframing tool that allows designers to create sketches of their web pages or applications. Use Case: Used for creating wireframes and mockups to plan the layout and design of the website before development.
Responsive Design Mode Purpose: A browser tool that allows developers to view their website on different screen sizes and resolutions. Use Case: Used to test and ensure the website is responsive across a range of devices, including mobile phones and tablets.
Coolors.co Purpose: An online tool for generating color palettes. Use Case: Used to select and create the color scheme for the website, ensuring a visually appealing design.
StartBootstrap.com Purpose: A website offering free and premium Bootstrap themes and templates. Use Case: Used as a resource for finding Bootstrap templates and inspiration for the website’s design.
Heroku Purpose: Used to deploy the Django application. Use Case: Heroku is a cloud platform that lets companies build, deliver, monitor, and scale apps.
Enhanced User Profiles
Advanced Search and Filtering
Mobile App Development
Social Media Integration
Photography Challenges
FAQ Page
During the development and testing phases of this project, several bugs were identified and subsequently fixed. Below is a summary of the bugs encountered, along with the steps taken to resolve them.
Bug: Navigation Menu Not Collapsing on Mobile
Bug: Image Upload Fails on Certain File Types
Bug: Form Validation Errors Not Displaying
Bug: 500 Internal Server Error on Photo Detail Page
Bug: Slow Load Times on Blog Page
This project uses Heroku, a platform as a service (PaaS) that enables developers to build, run, and operate applications entirely in the cloud.
Deployment steps are as follows, after account setup:
PORT
, and the value to 8000
then select add.Python
first, then Node.js
second. (if they are not in this order, you can drag them to rearrange them)Heroku needs three additional files in order to deploy properly.
You can install this project's requirements (where applicable) using:
pip3 install requirements.txt
If you have your own packages that have been installed, then the requirements file needs updated using:
pip3 freeze > requirements.txt
The Procfile can be created with the following command:
echo web: node index.js > Procfile
This project can be cloned or forked in order to make a local copy on your own system.
For either method, you will need to install any applicable packages found within the requirements.txt file.
pip3 install -r requirements.txt
.The database provided by Django db.sqlite3 is only accessible within the workspace environment. In order for Heroku to be able to access the database, a new database suitable for production needs to be created. I am using a postgreSQL database instance hosted on CI Database as this service is free.
The requirements.txt file lists all the dependencies needed to run the project. Below is a brief description of each package included in this file:
Specifically, when you set DEFAULT_FILE_STORAGE to use Cloudinary, all media files, including static files, might be uploaded to Cloudinary during the collectstatic process. This can cause unexpected behavior, especially if you intended to keep static files locally.
To avoid issues: Temporarily Remove Cloudinary Storage: Before running python3 manage.py collectstatic, temporarily remove or comment out the DEFAULT_FILE_STORAGE setting.
Run Collectstatic: Execute the collectstatic command to gather all static files locally.
Re-enable Cloudinary: After collecting static files, re-enable the DEFAULT_FILE_STORAGE to Cloudinary if needed.
In the current configuration, I've added 'SECURE': True to the CLOUDINARY_STORAGE settings to ensure all media files are loaded over HTTPS, which enhances security.
Images:
Documentation and Tutorials:
Django Allauth For seamless authentication integration.
Django documentation Essential for understanding Django’s robust framework.
Django Search Box For implementing search functionality.
Bootstrap: Crucial for creating responsive, mobile-first designs.
Daisy's walkthrough A fantastic resource that helped guide the development process.
Build a Photographer Personal Portfolio with Django 2020 Inspired the structure and features of this project.
Tools:
Pillow For handling image processing.
Cloudinary For managing media assets efficiently.
Pexels For providing high-quality stock images.
perplexity Assisted in generating ideas and refining content.
Grammerly Ensured the project's documentation was clear and professional.
Gitpod: The online IDE that facilitated the development of this project.
Code Institute: Provided foundational knowledge and the environment to apply it.
Stack Overflow: An invaluable resource for solving coding challenges.
W3Schools: Quick and reliable reference for HTML, CSS, and JavaScript.
Hackathon:
Hackathon: Participating in this event sharpened my coding skills and provided an opportunity to work in a team environment, ultimately earning 3rd place (Bronze).
I would like to express my sincere gratitude to the Hackathon team for the incredible learning experience. The challenges and teamwork during the event significantly enhanced my skills in Django, and I'm proud to have achieved 3rd place (Bronze).
Special thanks to Paul Thomas O'Riordan, Kristyna, my Cohort Facilitator, Rory Patrick Sheridan, my Code Institute Mentor, and Tim Nelson, my second Mentor, for their guidance and support throughout this journey. Your encouragement has been invaluable to my growth as a developer.