This is an old revision of the document!
Table of Contents
Create a project
django-admin startproject mysite python manage.py migrate
Create a super user account, which can login via http://localhost:8000/admin
python manage.py createsuperuser
Launch the server
python manage.py runserver
Create a app inside a project
Everything are apps. Each app has it's own subfolder. To create a app sceleton run
python manage.py startapp polls
Register URL
In the polls/urls.py file include the following code:
- polls/urls.py
polls/urls.py¶ from django.urls import path from . import views urlpatterns = [ # ex: /polls/ path('', views.index, name='index'), # ex: /polls/5/ path('<int:question_id>/', views.detail, name='detail'), # ex: /polls/5/results/ path('<int:question_id>/results/', views.results, name='results'), # ex: /polls/5/vote/ path('<int:question_id>/vote/', views.vote, name='vote'), ]
The corresponding view looks like this. The name correspond with the method name of views.py.
- polls/views.py
from django.shortcuts import render from django.http import HttpResponse def index(request): return HttpResponse("Hello, world. You're at the polls index.") def detail(request, question_id): return HttpResponse("You're looking at question %s." % question_id) def results(request, question_id): response = "You're looking at the results of question %s." return HttpResponse(response % question_id) def vote(request, question_id): return HttpResponse("You're voting on question %s." % question_id)
Now we need to add this url to our project:
- mysite/urls.py
from django.contrib import admin from django.urls import include, path urlpatterns = [ path('polls/', include('polls.urls')), path('admin/', admin.site.urls), ]
Templates
Templates are in the subfolder of the app. e.g. `mysite/polls/templates/*`
- polls/templates/polls/index.html
{% if latest_question_list %} <ul> {% for question in latest_question_list %} <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li> {% endfor %} </ul> {% else %} <p>No polls are available.</p> {% endif %}
To render such a templates you need to do response the corresponding HttpResponse:
- polls/view.py
latest_question_list = Question.objects.order_by('-pub_date')[:5] template = loader.get_template('polls/index.html') context = { 'latest_question_list': latest_question_list, } return HttpResponse(template.render(context, request))
or in short
- polls/view.py
from django.shortcuts import render def index(request): latest_question_list = Question.objects.order_by('-pub_date')[:5] context = {'latest_question_list': latest_question_list} return render(request, 'polls/index.html', context)
Namespace url patterns
Define the namespace by adding `app_name = <namespace>` inside of urls.py.
- polls/urls.py
app_name = 'polls' urlpatterns = [ # ex: /polls/ path('<int:question_id>/', views.detail, name ='detail'); ]
Then you need to specfiy the namespace in `{% url %}` of the template like this
- polls/templates/polls/detail.html
<li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>
Static files
Static files can be placed in the `static/` folder of each app. Then refere to them inside the template like:
- polls/templates/polls/index.html
{% load static %} <link rel="stylesheet" type="text/css" href="{% static 'polls/style.css' %}">
Mixedin for django_tables2
class UsefulMixin(tables.Table): age = AgeColumn() options = tables.Column(empty_values=()) def render_options(self): return format_html('<button>DELETE</button>') # age = tables.Column() class InstanceTable(UsefulMixin, tables.Table): age = AgeColumn() opt = tables.LinkColumn('delete_instance', args=[A('pk')], text='delete') class Meta: model = Instance template_name = 'django_tables2/bootstrap.html'
To make links of a value https://django-tables2.readthedocs.io/en/latest/pages/api-reference.html?highlight=LinkColumn#django_tables2.columns.LinkColumn
Custom tables.Column for django_tables2
class AgeColumn(tables.Column): def render(self, record): diff = record.age() color = '' if (diff.seconds > 60 * 60 ): color = 'red' else: color = 'green' return format_html('<span style="color:{}">{}</span>',color, diff) class InstanceTable(tables.Table): age = AgeColumn() opt = tables.LinkColumn('delete_instance', args=[A('pk')], text='delete') class Meta: model = Instance template_name = 'django_tables2/bootstrap.html'
Update database
Change the model file accordingly. doc:makemigrations
python manage.py makemigrations python manage.py migrate
