Starting a Django project

  1. Install Django

    ​​​​conda install django
    ​​​​python -m django --version
    
  2. Create a project

    ​​​​mkdir project_folder
    ​​​​cd project_folder
    ​​​​django-admin startproject travelclean_gui
    

    Create a secret file:

    ​​​​
    

    You need to redo this step when cloning the repository.

    This creates a skeleton folder structure.

  3. Start the development server

    ​​​​python3 manage.py runserver
    

    This is always useful during development

  4. Create a new app

    ​​​​python manage.py startapp cars
    

    This creates a folder named "cars". The folder contains

    • models.py:
      • Models map tables in the database to Python classes
    • views.py:
      • Urls are mapped to views
      • Views return html, which is sent to the client
    • urls.py
      • mapping of urls to views (can be done in travelclean_gui/urls.py)
    • admin.py
      • for managing the admin interface
    • tests.py
      • test for the models, views, forms
    • apps.py
    • migrations
      • managed by Django

    Add the new app to "travelclean_gui/settings.py":

    ​​​​INSTALLED_APPS = [
    ​​​​    'polls.apps.PollsConfig',
    ​​​​    ...
    ​​​​    'cars',
    ​​​​]
    
  5. Add a superuser

    ​​​​
    ​​​​python manage.py createsuperuser
    

    The superuser has access to the admin pages. Check out http://0.0.0.0:8000/admin.

  6. Add a model (data in the database)

    cars/models.py

    ​​​​from django.db import models
    
    ​​​​class Camera(models.Model):
    ​​​​    # Columns in the database table are members in the class
    ​​​​    description = models.CharField(max_length=200)
    ​​​​    ip = models.GenericIPAddressField(max_length=50)
    

    You need to update the database to reflect the new model:

    ​​​​python manage.py makemigrations
    ​​​​python manage.py migrate
    

    This will add the table into the database. It does not contain any data, since we didn't create a camera yet.

    The easiest way to change the data is to add the model to admin:

    cars/admin.py

    ​​​​from django.contrib import admin
    
    ​​​​from .models import Camera
    
    ​​​​admin.site.register(Camera)
    
  7. Add a URL and view

    travelclean_gui/urls.py:

    ​​​​from django.contrib import admin
    ​​​​from django.urls import include, path
    
    ​​​​urlpatterns = [
    ​​​​    path('', include('cars.urls')),
    ​​​​    path('admin/', admin.site.urls),
    ​​​​]
    

    cars/urls.py:

    ​​​​
    ​​​​from django.urls import path
    
    ​​​​from . import views
    
    ​​​​urlpatterns = [
    ​​​​    path('', views.index, name='index'),
    ​​​​]
    

    cars/views.py

    ​​​​from django.http import HttpResponse
    
    ​​​​def index(request):
    ​​​​    return HttpResponse("Hello!")
    
    • This view just returns text, but it's general python code, so it could be anything more complicated.
    • Django has a powerful templating system, that makes this a lot easier.
  8. Add a view to interact with the model

    cars/urls.py

    ​​​​from django.urls import path
    
    ​​​​from . import views
    
    ​​​​urlpatterns = [
    ​​​​    path('', views.index, name='index'),
    ​​​​    path('cameralist', views.CameraListView.as_view(), name='camera_list'),
    ​​​​    path('camera/<pk>', views.CameraDetailView.as_view(), name='camera'),
    ​​​​]
    
    

    cars/views.py

    ​​​​from django.shortcuts import render
    ​​​​from django.http import HttpResponse
    ​​​​from django.views import generic
    ​​​​
    ​​​​from .models import Camera
    
    
    ​​​​# Create your views here.
    
    ​​​​def index(request):
    ​​​​    return HttpResponse("Hello!")
    
    ​​​​class CameraListView(generic.ListView):
    ​​​​    model = Camera
    ​​​​    template_name = 'camera_list.html'
    ​​​​    
    ​​​​class CameraDetailView(generic.DetailView):
    ​​​​    model = Camera
    

    cars/templates/cars/camera_list.html

    ​​​​<html>  
    ​​​​<body>
    
    ​​​​    {% block content %}
    ​​​​    <h1>Camera List</h1>
    ​​​​       {% if camera_list %}
    ​​​​       <ul>
    ​​​​           {% for camera in camera_list %}
    ​​​​           <li>
    ​​​​              {{ camera.id }}: {{camera.description}}
    ​​​​           </li>
    ​​​​           {% endfor %}
    ​​​​      </ul>
    ​​​​      {% else %}
    ​​​​      <p>No cameras found</p>
    ​​​​      {% endif %}
    ​​​​   {% endblock %}
    ​​​​</body>
    ​​​​</html>
    

    cars/templates/cars/camera_detail.html

    ​​​​<html>
    ​​​​<body>
    
    ​​​​    {% block content %}
    ​​​​    <h1>Camera</h1>
    
    ​​​​    {{ camera.id }}: {{camera.description}} : {{camera.ip}}
    
    ​​​​    {% endblock %}
    ​​​​</body>
    ​​​​</html>
    
  9. Add a form for changing the data

    • In fact a view can change the data on post, but forms allow you to submit more structured data
Select a repo