Django URL Routing, Reverse Resolution, and Virtual Environments

Table Relationships in Django

Use Cases for One-to-One Relationships

In QQ, basic user info is linked to detailed info—this saves query time.

One-to-one tables can be merged into one or split into two separate tables.

Foreign keys should be placed on the many side of a one-to-many relationship. Create base tables first before establishing foreign key constraints.

For many-to-many relationships, foreign keys are set in the intermediate table.

Creating Table Relasionships

# Define base model first

class Book(models.Model):
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=8, decimal_places=2)
    publish = models.ForeignKey(to='Publish')
    author = models.ManyToManyField(to='Author')


class Publish(models.Model):
    title = models.CharField(max_length=32)
    email = models.EmailField()


class Author(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    author_detail = models.OneToOneField(to='AuthorDetails')


class AuthorDetails(models.Model):
    phone = models.BigIntegerField()
    address = models.CharField(max_length=32)

Django Request Lifecycle

Named vs Unnamed Groups

Unnamed Groups

  • url(r'^test/([0-9]{4})/', views.test)
  1. Error: test() takes 1 positional argument but 2 were given
  2. When unnamed groups exist, matched content becomes positional arguments
  3. test(request, x)

Named Groups

  • url(r'^test_add/(?P<y>\d+)/', views.test_add)
  1. When named groups exist, matched content becomes keyword arguments
  2. test_add(request, y)

Additional Notes

  1. Both group types allow passing extra parameters to view functions
  2. Mixing group types in same pattern causes error
  3. url(r'^index/(\d+)/(?P<y>\d+)/', views.index) fails
  4. Only use one group type per pattern

Route Matching

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'test/', views.test),
    url(r'test_add/', views.test_add),
]

Matching Behavior

  1. Django matches regex patterns sequentially
  2. If no slash is present, browser redirects with trailing slash
  3. Disable auto redirection via APPEND_SLASH = False
  4. $ restricts matching to exact suffix
  5. Query parameters (?) are ignored during matching

Reverse Resolution

What Is Reverse Resolution?

Generate URLs dynamically from named patterns.

Case 1: No Regex in Pattern

url(r'^home/', views.home, name='xxx')

Frontend:

<a href="{% url 'xxx' %}">111</a>

Backend:

def get_url(request):
    url = reverse('xxx')
    return redirect(url)

Case 2: Unnamed Group Resolution

Error when calling reverse('xxx') without arguments.

Frontend:

<a href="{% url 'xxx' 1 %}">111</a>

Backend:

reverse('xxx', args=(1,))

Case 3: Named Group Resolution

Frontend:

<a href="{% url 'xxx' yyy=1 %}">111</a>

Backend:

reverse('xxx', kwargs={'yyy': 1})

Practical Example: Edit Functionality

url(r'^edit_user/(\d+)/', views.edit_user, name='edit')

def edit_user(request, edit_id):
    pass

Template usage:

{% for user_obj in user_list %}
    <a href='/edit_user/{{user_obj.id}}/'>Edit</a>
    <a href='{% url "edit" user_obj.id %}'>Edit</a>
{% endfor %}

URL Dispatching

Prerequisites

Each Django app can have its own urls.py, templates, and static directories.

This enables modular development and easy integration.

Main URL Configuration

from django.conf.urls import url, include

urlpatterns = [
    url(r'^app01/', include('app01.urls')),
    url(r'^app02/', include('app02.urls')),
]

Sub-URL Configuration

from django.conf.urls import url
from app01 import views

urlpatterns = [
    url('^reg/', views.reg)
]

Namespaces

Purpose

Avoid naming conflicts between apps.

Usage

Front end:

<a href="{% url 'app01:reg' %}"></a>

Backend:

reverse('x:reg')

Configuration:

urlpatterns = [
    url(r'^app01/', include('app01.urls', namespace='x')),
    url(r'^app02/', include('app02.urls', namespace='y')),
]

Recommendation

Use app prefixes for clarity:

url('^reg/', views.reg, name='app01_reg')

Pseudo Static Pages

Convert dynamic pages to static-like appearance for SEO optimization.

Virtual Environments

Why Use Them?

Isolate dependencies per project.

Creation

Create a new Python interpreter instance with clean packages.

Django Version Differences

Django 1.X vs 2.X

  • Use url() in 1.X; path() in 2.X
  • path() does not support regex
  • re_path() supports regex like url()
  • path() offers built-in converters

File Upload Handling

Form Requirements

  1. Method must be POST
  2. Enctype must be multipart/form-data
  3. CSRF middleware must be disabled in settings

Template

<form action="" method="post" enctype="multipart/form-data">
    <input type="file" name="my_file">
    <input type="submit">
</form>

Backend Code

def upload_file(request):
    if request.method == 'POST':
        file_obj = request.FILES.get('my_file')
        with open(file_obj.name, 'wb') as fw:
            for line in file_obj:
                fw.write(line)
    return render(request, 'upload.html')

Tags: Django URL routing Reverse Resolution Virtual Environment File Upload

Posted on Tue, 04 Aug 2026 16:52:05 +0000 by reub77