User Tools

Site Tools


programming:django

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
programming:django [2018/11/26 10:11] clemixprogramming:django [2019/04/24 16:22] (current) – [Static files] clemix
Line 1: Line 1:
-== Create a project ==+ 
 +==== Create a project ====
 <code bash> <code bash>
 django-admin startproject mysite django-admin startproject mysite
 +python manage.py migrate
 +</code>
 +
 +Create a super user account, which can login via http://localhost:8000/admin
 +<code bash>
 +python manage.py createsuperuser
 </code> </code>
  
-== Launch the server ==+==== Launch the server ====
 <code lang=bash> <code lang=bash>
 python manage.py runserver python manage.py runserver
 </code> </code>
  
-== Create a app inside a project==+==== Create a app inside a project ====
 Everything are apps. Each app has it's own subfolder. To create a app sceleton run Everything are apps. Each app has it's own subfolder. To create a app sceleton run
 <code lang=bash> <code lang=bash>
Line 15: Line 22:
 </code> </code>
  
-== Register URL ==+==== Register URL ====
 In the polls/urls.py file include the following code: In the polls/urls.py file include the following code:
 <code python polls/urls.py> <code python polls/urls.py>
Line 25: Line 32:
  
 urlpatterns = [ urlpatterns = [
 +    # ex: /polls/
     path('', views.index, name='index'),     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'),
 ] ]
 +</code>
 +
 +The corresponding view looks like this. The name correspond with the method name of views.py.
 +<code python 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)
 </code> </code>
  
Line 39: Line 74:
     path('admin/', admin.site.urls),     path('admin/', admin.site.urls),
 ] ]
-</pyton>+</code> 
 + 
 +==== Templates ==== 
 +Templates are in the subfolder of the app. e.g. `mysite/polls/templates/*` 
 +<code html 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 %} 
 +</code> 
 + 
 +To render such a templates you need to do response the corresponding HttpResponse: 
 +<code python 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)) 
 +</code> 
 + 
 +or in short 
 +<code python 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) 
 +</code> 
 + 
 + 
 +==== Namespace url patterns ==== 
 +Define the namespace by adding `app_name = <namespace>` inside of urls.py. 
 +<code python polls/urls.py> 
 +app_name = 'polls' 
 +urlpatterns = [ 
 +    # ex: /polls/ 
 +    path('<int:question_id>/', views.detail, name ='detail'); 
 +
 +</code> 
 +Then you need to specfiy the namespace in `{% url %}` of the template like this 
 +<code html polls/templates/polls/detail.html> 
 +        <li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li> 
 +</code> 
 + 
 +==== Static files ==== 
 +Static files can be placed in the `static/` folder of each app. 
 +Then refere to them inside the template like: 
 +<code html polls/templates/polls/index.html> 
 +{% load  static %} 
 +<link rel="stylesheet" type="text/css" href="{% static 'polls/style.css' %}"> 
 +</code> 
 + 
 +Run this command to store static files in proper folder: 
 +<code bash> 
 +python manage.py collectstatic 
 +</code> 
 +==== django_tables2 ==== 
 +=== Mixedin === 
 + 
 +<code python> 
 +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' 
 + 
 +</code> 
 + 
 +===  Custom tables.Column === 
 +<code python> 
 +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' 
 +</code> 
 + 
 +To make links of a value https://django-tables2.readthedocs.io/en/latest/pages/api-reference.html?highlight=LinkColumn#django_tables2.columns.LinkColumn 
 +==== Update database ==== 
 +Change the model file accordingly. [[https://docs.djangoproject.com/en/2.1/ref/django-admin/#makemigrations|doc:makemigrations]] 
 +<code bash> 
 +python manage.py makemigrations 
 +python manage.py migrate 
 +</code>
  
 +==== Bootstrap ====
 +https://www.w3schools.com/bootstrap/default.asp
  
  
 +==== Django Rest Framework ====
 +https://www.django-rest-framework.org/tutorial/quickstart/
  
programming/django.1543223487.txt.gz · Last modified: by clemix

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki