Fading Coder

One Final Commit for the Last Sprint

Home > Tech > Content

Building a Photo Gallery Application with Django

Tech May 15 1

Framework Overview and Project Initialization

Django is a high-performance Python web framework engineered for rapid development and clean architectural patterns. It supplies integrated components for URL routing, template rendering, database abstraction, session management, and authentication, enabling developers to concentrate on core functionality rather than repetitive scaffolding.

Environment Preparation

Install the core package using pip before proceeding:

pip install django

Create the project workspace and register a dedicated application module:

django-admin startproject media_hub
cd media_hub
python manage.py startapp gallery_core

Media Configuration and Root Routing

Register the new module in the primary configuration file so Django recognizes its signals and migrations:

INSTALLED_APPS = [
    # Built-in applications...
    'gallery_core',
]

Define persistent storage locations for user-uploaded content within the same configuration file:

import os
from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent

MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media_files'

Enible local file serving during development by injecting the helper function into the root URL configuration:

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('gallery_core.urls')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Data Modeling and Administration Panel

Declare the database schema in the application's model layer. The structure captures a textual descriptor and a binary image reference:

from django.db import models

class Asset(models.Model):
    headline = models.CharField(max_length=100)
    uploaded_image = models.ImageField(upload_to='assets/%Y/%m/%d')

    def __str__(self):
        return self.headline

Expose the entity through the administrative interface using the registered decorator pattern:

from django.contrib import admin
from .models import Asset

@admin.register(Asset)
class AssetAdmin(admin.ModelAdmin):
    list_display = ('headline', 'uploaded_image')
    list_filter = ('uploaded_image',)

Rendering the Collection View

Construct a view function that retrieves stored records and injects them into the template context:

from django.shortcuts import render
from .models import Asset

def show_collection(request):
    assets = Asset.objects.all()
    return render(request, 'collection.html', {'assets': assets})

The corresponding template iterates over the queryset and generates a responsive grid layout:


<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Asset Gallery</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body class="p-4 container">
    <div class="row g-4">
        {% for item in assets %}
        <div class="col-md-4">
            <div class="card h-100 shadow-sm">
                <img src="{{ item.uploaded_image.url }}" class="card-img-top p-2" alt="{{ item.headline }}" style="height:200px; object-fit:cover;">
                <div class="card-body">
                    <h5 class="card-title mb-0">{{ item.headline }}</h5>
                </div>
            </div>
        </div>
        {% endfor %}
    </div>
</body>
</html>

Link the view to an empty string route to establish it as the landing page:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.show_collection, name='home'),
]

Implementing File Submission Logic

Separate form definitions into their own module to improve maintainability. Django's ModelForm automatically maps model fields to input widgets:

from django import forms
from .models import Asset

class SubmissionForm(forms.ModelForm):
    class Meta:
        model = Asset
        fields = ['headline', 'uploaded_image']

The route handler must distinguish between GET requests (displaying the blank form) and POST requests (processing submitted payload):

from django.shortcuts import render, redirect
from .forms import SubmissionForm

def handle_submit(request):
    if request.method == 'POST':
        form = SubmissionForm(data=request.POST, files=request.FILES)
        if form.is_valid():
            form.save()
            return redirect('home')
    else:
        form = SubmissionForm()
    return render(request, 'submit_asset.html', {'form': form})

Extend the application URL configuration to expose the upload endpoint:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.show_collection, name='home'),
    path('add-new/', views.handle_submit, name='submit'),
]

Create the presentation layer for the submission interface. Note the mandatory enctype attribute required for multipart data transmission:


<html>
<head><title>Upload Asset</title></head>
<body class="d-flex justify-content-center align-items-center vh-100 bg-light">
    <form method="POST" enctype="multipart/form-data" class="p-4 bg-white rounded shadow" style="width:350px;">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit" class="btn btn-primary w-100">Process Submission</button>
    </form>
</body>
</html>

Database Synchronization and Execution

Translate model definitions in to executable SQL commands targeting the configured database backend:

python manage.py makemigrations
python manage.py migrate

Generate a privileged account capable of accessing the administraitve dashboard:

python manage.py createsuperuser

Activate the built-in development server:

python manage.py runserver

Navigate to http://127.0.0.1:8000/add-new/ to test the ingestion pipeline. Alternatively, access the administration console at /admin/ to verify direct record creation and thumbnail preview rendering.

Tags: Django

Related Articles

Understanding Strong and Weak References in Java

Strong References Strong reference are the most prevalent type of object referencing in Java. When an object has a strong reference pointing to it, the garbage collector will not reclaim its memory. F...

Comprehensive Guide to SSTI Explained with Payload Bypass Techniques

Introduction Server-Side Template Injection (SSTI) is a vulnerability in web applications where user input is improper handled within the template engine and executed on the server. This exploit can r...

Implement Image Upload Functionality for Django Integrated TinyMCE Editor

Django’s Admin panel is highly user-friendly, and pairing it with TinyMCE, an effective rich text editor, simplifies content management significantly. Combining the two is particular useful for bloggi...

Leave a Comment

Anonymous

◎Feel free to join the discussion and share your thoughts.