SlideShare una empresa de Scribd logo
1 de 17
Descargar para leer sin conexión
Basic CRUD in Django
Low-Level Creation, Updating, and Deletion of Data

                   by Mike Cantelon
                 http://mikecantelon.com
Setting Up a Project
1.   Change to the directory in which your project should be created

2.   Issue the command django-admin.py startproject linkdump

3.   This command will have created a directory, with the specified project name (in
     this case “linkdump”), containing base files for the project

4.   Change to this directory

5.   Issue the command python manage.py runserver to start the
     development server (http://127.0.0.1:8000)

6.   If your project is to use a new, rather than existing, database then create it
     (unless using sqlite, which be automatically created)

7.   Edit settings.py to configure access to your database

8.   Issue the command python manage.py syncdb to build database tables
     needed by the administration interface (useful later). Follow the prompts.
Creating an Application
1.   As a simple demonstration, we’ll create an application to submit links to

2.   To create the application’s directory and base files, we issue the command
     python manage.py startapp linktracker (“linktracker” being the
     name of our application)

3.   Next, we edit linktracker/models.py to define our model
          class Link (models.Model):
              link_description = models.CharField(maxlength=200)
              link_url = models.CharField(maxlength=200)

4.   To add our app to the project, we edit the project’s settings.py to add our
     app (linkdump.linktracker) to the INSTALLED_APPS list in settings.py

5.   To update the database, automatically creating the necessary tables, we issue
     the command python manage.py syncdb
Activating
                 Administration
1.   Add “django.contrib.admin” to the INSTALLED_APPS list in settings.py

2.   Issue the command python manage.py syncdb

3.   Edit urls.py to enable admin (the next slide will talk more about this file’s functionality)

4.   Issue the command python manage.py runserver

5.   You can verify that admin is running by browsing http://127.0.0.1:8000/admin

6.   Edit linktracker/models.py to turn on admin for links:
            class Link(models.Model):
                  # ...
                  class Admin:
                       pass

7.   Edit linktrackers/models.py to enable default (naming) column for links
            def __str__(self):
                  return self.link_description
Designing URLs
•   Now that we can enter data, adding a way for user to see this data would be
    useful

•   To present data we need to write a “view” which is mapped to a URL
    pattern

•   Editing urls.py allows URL patterns to be defined using regular expressions

•   Add the below link to your urls.py file:
    (r’^links/$’, ‘linkdump.linktracker.views.list’)

•   The above line will, if someone browses /links/ on our site, try to display the
    results of the list view of the links application of the linkdump project... we
    have not yet created a list view, however, so we just get an error!
Enabling Templating
1.   Views usually incorporate HTML templates so presentation is separated
     from logic

2.   To enable templating, create a directory called “template” in which to store
     your templates then edit settings.py and add “template” to TEMPLATE_DIRS

3.   Edit linktracker/views.py to create a list view for links that uses templating
         from linkdump.linktracker.models import Link
         from django.template import Context, loader
         from django.shortcuts import render_to_response

         def list(request):
             link_list = Link.objects.all()
             return render_to_response(
                 ‘links/list.html’,
                 {‘link_list’: link_list}
             )
Creating A Template
1.   We’ll create a template to crudely display link items

2.   Edit template/links/list.html:

          {% if link_list %}
              <ul>
                   {% for link in link_list %}
                       <li><a href=’{{ link.link_url }}’>
                           {{link.link_description}}</a></li>
                   {% endfor %}
              </ul>
          {% else %}
              <p>No links found.</p>
          {% endif %}

3.   The /links/ URL pattern now actually does something!
Pagination (1 of 3)
•   Use the admin interface to add a bunch of links then reload
    the /links/ URL

•   An unlimited list is a problem so we need to add pagination

•   We will have to add pagination support in three places: our
    URL patterns (urls.py), our list view (linktracker/views.py),
    and our template (template/links/list.html

•   To add a URL pattern supporting pagination, add the below
    line to urls.py:
    (r’^links/(?P<page>d+)’, ‘linkdump.linktracker.views.list’)
Pagination (2 of 3)
•   To add pagination support to linktracker/views.py, first add the following line
    near the start:
      from django.core.paginator import ObjectPaginator, InvalidPage


•   Next, change the list function in linktracker/views.py to the code below:
        def list(request, page = 0):
            page = int(page)
            link_list = ObjectPaginator(Link.objects.all(), 5)
            has_previous = link_list.has_previous_page(page)
            has_next = link_list.has_next_page(page)
            return render_to_response(‘links/list.html’,
                {‘link_list’: link_list.get_page(page),
                 ‘has_previous’: has_previous,
                 ‘previous_page’: page - 1,
                 ‘has_next’: has_next,
                 ‘next_page’: page + 1}
            )
Pagination (3 of 3)
•   Last, but not least, you’ll want to change your template/links/
    list.html HTML template to support pagination... add the
    following lines before the line containing “else”:
        {% if has_previous %}
        <a href=’/links/{{ previous_page }}’>Previous</a>
            {% if has_next %} | {% endif %}
        {% endif %}

        {% if has_next %}
        <a href=’/links/{{ next_page }}’>Next</a>
        {% endif %}


•   Pagination is now a wonder to behold!
Prep for CRUD (1 of 2)
•   Before getting into the nitty gritty of CRUD, we need a way to give users
    feedback for when they create, update, or delete data

•   One simple way to do this is by passing a message via a GET parameter

•   To allow this functionality we need to modify our list view to receive
    messages and modify the list.html template to display messages

•   Change the first line of the list view in views.py, adding a parameter for
    messages:
        def list(request, page = 0, message = quot;quot;):


•   Also in views.py, add a line in the list view so the passed message is
    included in the list of parameters relayed to the list.html template:
        ‘message’: message,
Prep for CRUD (2 of 2)
•   Now that we’re preparing to add CRUD functionality, we need to update
    our list HTML template as shown below:
      {% if message %}
       <b>{{ message }}</b>
       <p>
       {% endif %}
       {% if link_list %}
           <table>
           {% for link in link_list %}
               <tr bgcolor='{% cycle FFFFFF,EEEEEE as rowcolor %}'>
                    <td><a href='{{ link.link_url }}'>{{ link.link_description }}</a></td>
                    <td><a href='/links/edit/{{ link.id }}'>Edit</a></td>
                    <td><a href='/links/delete/{{ link.id }}'>Delete</a></td>
               </tr>
           {% endfor %}
           </table>
           <p>
           {% if has_previous %}
               <a href='/links/{{ previous_page }}'>Previous</a>
               {% if has_next %}|{% endif %}
           {% endif %}

           {% if has_next %}
               <a href='/links/{{ next_page }}'>Next</a>
           {% endif %}
       {% else %}
           <p>No links found.</p>
       {% endif %}
       <p>

       <a href='/links/new'>Add Link</a>
Creating Data (1 of 2)
•   Allowing users to submit data requires first displaying an HTML form then
    adding the submitted data

•   To start, add a URL for form display to urls.py:
        (r’^links/new’, ‘linkdump.linktracker.views.new’)


•   To deal with the submitted data, we add another URL to urls.py:
        (r’^links/add/’, ‘linkdump.linktracker.views.add’)


•   Then, to display an HTML add form in linktracker/views.py, add the following
    block of code:
        def new(request):
            return render_to_reponse(
                ‘links/form.html’,
                {‘action’: ‘add’,
                ‘button’: ‘Add’}
            )
Creating Data (2 of 2)
•   Next, we add the form HTML template (which, as written below, can be
    used for adding or editing, as we’ll see later):
       <form action=’/links/{{ action }}/’ method=’post’>
           Description:
           <input name=link_description value=”{{ link.link_description|escape}}”><br />
           URL:
           <input name=link_url value=’{{ link.link_url|escape }}’><br />
           <input type=submit value=’{{ button }}’>
       </form>


•   Finally, we add logic to linktracker/views.py to add the submitted data then
    return to the list view, passing a message:
       def add(request):
           link_description = request.POST[“link_description”]
           link_url = request.POST[“link_url”]
           link = Link(
               link_description = link_description,
               link_url = link_url
           )
           link.save()
           return list(request, message=”Link added!”)
Updating Data (1 of 2)
•   Allowing users to upate data requires first displaying an HTML form showing
    current data then, upon submission, doing the actual update

•   To start, add a URL for form display to urls.py:
        (r’^links/edit/(?P<id>d+)’, ‘linkdump.linktracker.views.edit’)


•   Then, to display an HTML edit form in linktracker/views.py, add the following
    block of code:
        def edit(request, id):
            link = Link.objects.get(id=id)
            return render_to_reponse(
                ‘links/form.html’,
                {‘action’: ‘update/’ + id,
                ‘button’: ‘Update’}
            )


•   NOTE: As the HTML form we added earlier can be used to edit, we’re re-
    using it in the above code
Updating Data (2 of 2)

•   To deal with submitted updates, we add another URL to urls.py:
        (r’^links/update/(?P<id>d+)’, ‘linkdump.linktracker.views.update’)


•   Finally, we add logic to linktracker/views.py to add the submitted data then
    return to the list view, passing a message:
        def update(request, id):
            link = Link.objects.get(id=id)
            link.link_description = request.POST[“link_description”]
            link.link_url = request.POST[“link_url”]
            link.save()
            return list(request, message=”Link updated!”)
Deleting Data

•   Allowing users to delete data requires first displaying an HTML form
    showing current data then, upon submission, doing the actual update

•   To support deletion, add a new URL pattern to urls.py:
        (r'^links/delete/(?P<id>d+)', 'diglic.links.views.delete')


•   Then, to display an HTML edit form in linktracker/views.py, add the following
    block of code:
        def delete(request, id):
            Link.objects.get(id=id).delete()
            return list(request, message=”Link deleted!”)

Más contenido relacionado

La actualidad más candente

Introduction to Web Programming - first course
Introduction to Web Programming - first courseIntroduction to Web Programming - first course
Introduction to Web Programming - first course
Vlad Posea
 
Document Object Model
Document Object ModelDocument Object Model
Document Object Model
chomas kandar
 

La actualidad más candente (20)

Introduction to html
Introduction to htmlIntroduction to html
Introduction to html
 
GET and POST in PHP
GET and POST in PHPGET and POST in PHP
GET and POST in PHP
 
Django for Beginners
Django for BeginnersDjango for Beginners
Django for Beginners
 
CSS Animations & Transitions
CSS Animations & TransitionsCSS Animations & Transitions
CSS Animations & Transitions
 
Introduction To Django
Introduction To DjangoIntroduction To Django
Introduction To Django
 
Php gd library
Php gd libraryPhp gd library
Php gd library
 
Basic concepts for python web development
Basic concepts for python web developmentBasic concepts for python web development
Basic concepts for python web development
 
Introduction to Web Programming - first course
Introduction to Web Programming - first courseIntroduction to Web Programming - first course
Introduction to Web Programming - first course
 
Threads concept in java
Threads concept in javaThreads concept in java
Threads concept in java
 
Java thread life cycle
Java thread life cycleJava thread life cycle
Java thread life cycle
 
Std 10 Computer Chapter 3 Handling Images in HTML (Part 1)
Std 10 Computer Chapter 3 Handling Images in HTML (Part 1)Std 10 Computer Chapter 3 Handling Images in HTML (Part 1)
Std 10 Computer Chapter 3 Handling Images in HTML (Part 1)
 
HTML + CSS Examples
HTML + CSS ExamplesHTML + CSS Examples
HTML + CSS Examples
 
Introduction to php
Introduction to phpIntroduction to php
Introduction to php
 
Php mysql
Php mysqlPhp mysql
Php mysql
 
Laravel presentation
Laravel presentationLaravel presentation
Laravel presentation
 
Files in php
Files in phpFiles in php
Files in php
 
Introduction to PHP
Introduction to PHPIntroduction to PHP
Introduction to PHP
 
An Introduction to the DOM
An Introduction to the DOMAn Introduction to the DOM
An Introduction to the DOM
 
Html
HtmlHtml
Html
 
Document Object Model
Document Object ModelDocument Object Model
Document Object Model
 

Destacado

Sphinx: Leveraging Scalable Search in Drupal
Sphinx: Leveraging Scalable Search in DrupalSphinx: Leveraging Scalable Search in Drupal
Sphinx: Leveraging Scalable Search in Drupal
elliando dias
 
CodeFest 2014. Егоров В. — Что за… Dart?
CodeFest 2014. Егоров В. — Что за… Dart?CodeFest 2014. Егоров В. — Что за… Dart?
CodeFest 2014. Егоров В. — Что за… Dart?
CodeFest
 
High Performance Web Pages - 20 new best practices
High Performance Web Pages - 20 new best practicesHigh Performance Web Pages - 20 new best practices
High Performance Web Pages - 20 new best practices
Stoyan Stefanov
 
From NASA to Startups to Big Commerce
From NASA to Startups to Big CommerceFrom NASA to Startups to Big Commerce
From NASA to Startups to Big Commerce
Daniel Greenfeld
 

Destacado (19)

Django
DjangoDjango
Django
 
Not Only Drupal
Not Only DrupalNot Only Drupal
Not Only Drupal
 
Sphinx: Leveraging Scalable Search in Drupal
Sphinx: Leveraging Scalable Search in DrupalSphinx: Leveraging Scalable Search in Drupal
Sphinx: Leveraging Scalable Search in Drupal
 
CodeFest 2014. Егоров В. — Что за… Dart?
CodeFest 2014. Егоров В. — Что за… Dart?CodeFest 2014. Егоров В. — Что за… Dart?
CodeFest 2014. Егоров В. — Что за… Dart?
 
개발자를 위한 Amazon Lightsail Deep-Dive - 정창훈(당근마켓)
개발자를 위한 Amazon Lightsail Deep-Dive - 정창훈(당근마켓)개발자를 위한 Amazon Lightsail Deep-Dive - 정창훈(당근마켓)
개발자를 위한 Amazon Lightsail Deep-Dive - 정창훈(당근마켓)
 
High Performance Web Pages - 20 new best practices
High Performance Web Pages - 20 new best practicesHigh Performance Web Pages - 20 new best practices
High Performance Web Pages - 20 new best practices
 
Modul pelatihan-django-dasar-possupi-v1
Modul pelatihan-django-dasar-possupi-v1Modul pelatihan-django-dasar-possupi-v1
Modul pelatihan-django-dasar-possupi-v1
 
MetaZeta Clusters Overview
MetaZeta Clusters OverviewMetaZeta Clusters Overview
MetaZeta Clusters Overview
 
Computational genomics approaches to precision medicine
Computational genomics approaches to precision medicineComputational genomics approaches to precision medicine
Computational genomics approaches to precision medicine
 
Computational genomics course poster 2015 (BIMSB/MDC-Berlin)
Computational genomics course poster 2015 (BIMSB/MDC-Berlin)Computational genomics course poster 2015 (BIMSB/MDC-Berlin)
Computational genomics course poster 2015 (BIMSB/MDC-Berlin)
 
Danger Of Free
Danger Of FreeDanger Of Free
Danger Of Free
 
Collaborative Filtering and Recommender Systems By Navisro Analytics
Collaborative Filtering and Recommender Systems By Navisro AnalyticsCollaborative Filtering and Recommender Systems By Navisro Analytics
Collaborative Filtering and Recommender Systems By Navisro Analytics
 
From NASA to Startups to Big Commerce
From NASA to Startups to Big CommerceFrom NASA to Startups to Big Commerce
From NASA to Startups to Big Commerce
 
The Physics of Fast Image Compression
The Physics of Fast Image CompressionThe Physics of Fast Image Compression
The Physics of Fast Image Compression
 
Apache Mesos at Twitter (Texas LinuxFest 2014)
Apache Mesos at Twitter (Texas LinuxFest 2014)Apache Mesos at Twitter (Texas LinuxFest 2014)
Apache Mesos at Twitter (Texas LinuxFest 2014)
 
Keynote: Apache HBase at Yahoo! Scale
Keynote: Apache HBase at Yahoo! ScaleKeynote: Apache HBase at Yahoo! Scale
Keynote: Apache HBase at Yahoo! Scale
 
An Abusive Relationship with AngularJS
An Abusive Relationship with AngularJSAn Abusive Relationship with AngularJS
An Abusive Relationship with AngularJS
 
Hour of Code: Best Practices for Successful Educators
Hour of Code: Best Practices for Successful EducatorsHour of Code: Best Practices for Successful Educators
Hour of Code: Best Practices for Successful Educators
 
Git Branching Model
Git Branching ModelGit Branching Model
Git Branching Model
 

Similar a Basic Crud In Django

TurboGears2 Pluggable Applications
TurboGears2 Pluggable ApplicationsTurboGears2 Pluggable Applications
TurboGears2 Pluggable Applications
Alessandro Molina
 

Similar a Basic Crud In Django (20)

Laravel 8 export data as excel file with example
Laravel 8 export data as excel file with exampleLaravel 8 export data as excel file with example
Laravel 8 export data as excel file with example
 
The Django Web Application Framework 2
The Django Web Application Framework 2The Django Web Application Framework 2
The Django Web Application Framework 2
 
The Django Web Application Framework 2
The Django Web Application Framework 2The Django Web Application Framework 2
The Django Web Application Framework 2
 
The Django Web Application Framework 2
The Django Web Application Framework 2The Django Web Application Framework 2
The Django Web Application Framework 2
 
The Django Web Application Framework 2
The Django Web Application Framework 2The Django Web Application Framework 2
The Django Web Application Framework 2
 
Django crush course
Django crush course Django crush course
Django crush course
 
Lecture n
Lecture nLecture n
Lecture n
 
Language literacy
Language literacyLanguage literacy
Language literacy
 
Task scheduling in laravel 8 tutorial
Task scheduling in laravel 8 tutorialTask scheduling in laravel 8 tutorial
Task scheduling in laravel 8 tutorial
 
Ruby on rails3 - introduction to rails
Ruby on rails3 - introduction to railsRuby on rails3 - introduction to rails
Ruby on rails3 - introduction to rails
 
TurboGears2 Pluggable Applications
TurboGears2 Pluggable ApplicationsTurboGears2 Pluggable Applications
TurboGears2 Pluggable Applications
 
Python Code Camp for Professionals 1/4
Python Code Camp for Professionals 1/4Python Code Camp for Professionals 1/4
Python Code Camp for Professionals 1/4
 
Build and deploy Python Django project
Build and deploy Python Django projectBuild and deploy Python Django project
Build and deploy Python Django project
 
Working With Sharepoint 2013 Apps Development
Working With Sharepoint 2013 Apps DevelopmentWorking With Sharepoint 2013 Apps Development
Working With Sharepoint 2013 Apps Development
 
Useful Rails Plugins
Useful Rails PluginsUseful Rails Plugins
Useful Rails Plugins
 
Nodejs.meetup
Nodejs.meetupNodejs.meetup
Nodejs.meetup
 
ASP.NET MVC introduction
ASP.NET MVC introductionASP.NET MVC introduction
ASP.NET MVC introduction
 
The Rails Way
The Rails WayThe Rails Way
The Rails Way
 
Introduction to Django
Introduction to DjangoIntroduction to Django
Introduction to Django
 
Angular - Chapter 4 - Data and Event Handling
 Angular - Chapter 4 - Data and Event Handling Angular - Chapter 4 - Data and Event Handling
Angular - Chapter 4 - Data and Event Handling
 

Último

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
Enterprise Knowledge
 

Último (20)

ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Evaluating the top large language models.pdf
Evaluating the top large language models.pdfEvaluating the top large language models.pdf
Evaluating the top large language models.pdf
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 

Basic Crud In Django

  • 1. Basic CRUD in Django Low-Level Creation, Updating, and Deletion of Data by Mike Cantelon http://mikecantelon.com
  • 2. Setting Up a Project 1. Change to the directory in which your project should be created 2. Issue the command django-admin.py startproject linkdump 3. This command will have created a directory, with the specified project name (in this case “linkdump”), containing base files for the project 4. Change to this directory 5. Issue the command python manage.py runserver to start the development server (http://127.0.0.1:8000) 6. If your project is to use a new, rather than existing, database then create it (unless using sqlite, which be automatically created) 7. Edit settings.py to configure access to your database 8. Issue the command python manage.py syncdb to build database tables needed by the administration interface (useful later). Follow the prompts.
  • 3. Creating an Application 1. As a simple demonstration, we’ll create an application to submit links to 2. To create the application’s directory and base files, we issue the command python manage.py startapp linktracker (“linktracker” being the name of our application) 3. Next, we edit linktracker/models.py to define our model class Link (models.Model): link_description = models.CharField(maxlength=200) link_url = models.CharField(maxlength=200) 4. To add our app to the project, we edit the project’s settings.py to add our app (linkdump.linktracker) to the INSTALLED_APPS list in settings.py 5. To update the database, automatically creating the necessary tables, we issue the command python manage.py syncdb
  • 4. Activating Administration 1. Add “django.contrib.admin” to the INSTALLED_APPS list in settings.py 2. Issue the command python manage.py syncdb 3. Edit urls.py to enable admin (the next slide will talk more about this file’s functionality) 4. Issue the command python manage.py runserver 5. You can verify that admin is running by browsing http://127.0.0.1:8000/admin 6. Edit linktracker/models.py to turn on admin for links: class Link(models.Model): # ... class Admin: pass 7. Edit linktrackers/models.py to enable default (naming) column for links def __str__(self): return self.link_description
  • 5. Designing URLs • Now that we can enter data, adding a way for user to see this data would be useful • To present data we need to write a “view” which is mapped to a URL pattern • Editing urls.py allows URL patterns to be defined using regular expressions • Add the below link to your urls.py file: (r’^links/$’, ‘linkdump.linktracker.views.list’) • The above line will, if someone browses /links/ on our site, try to display the results of the list view of the links application of the linkdump project... we have not yet created a list view, however, so we just get an error!
  • 6. Enabling Templating 1. Views usually incorporate HTML templates so presentation is separated from logic 2. To enable templating, create a directory called “template” in which to store your templates then edit settings.py and add “template” to TEMPLATE_DIRS 3. Edit linktracker/views.py to create a list view for links that uses templating from linkdump.linktracker.models import Link from django.template import Context, loader from django.shortcuts import render_to_response def list(request): link_list = Link.objects.all() return render_to_response( ‘links/list.html’, {‘link_list’: link_list} )
  • 7. Creating A Template 1. We’ll create a template to crudely display link items 2. Edit template/links/list.html: {% if link_list %} <ul> {% for link in link_list %} <li><a href=’{{ link.link_url }}’> {{link.link_description}}</a></li> {% endfor %} </ul> {% else %} <p>No links found.</p> {% endif %} 3. The /links/ URL pattern now actually does something!
  • 8. Pagination (1 of 3) • Use the admin interface to add a bunch of links then reload the /links/ URL • An unlimited list is a problem so we need to add pagination • We will have to add pagination support in three places: our URL patterns (urls.py), our list view (linktracker/views.py), and our template (template/links/list.html • To add a URL pattern supporting pagination, add the below line to urls.py: (r’^links/(?P<page>d+)’, ‘linkdump.linktracker.views.list’)
  • 9. Pagination (2 of 3) • To add pagination support to linktracker/views.py, first add the following line near the start: from django.core.paginator import ObjectPaginator, InvalidPage • Next, change the list function in linktracker/views.py to the code below: def list(request, page = 0): page = int(page) link_list = ObjectPaginator(Link.objects.all(), 5) has_previous = link_list.has_previous_page(page) has_next = link_list.has_next_page(page) return render_to_response(‘links/list.html’, {‘link_list’: link_list.get_page(page), ‘has_previous’: has_previous, ‘previous_page’: page - 1, ‘has_next’: has_next, ‘next_page’: page + 1} )
  • 10. Pagination (3 of 3) • Last, but not least, you’ll want to change your template/links/ list.html HTML template to support pagination... add the following lines before the line containing “else”: {% if has_previous %} <a href=’/links/{{ previous_page }}’>Previous</a> {% if has_next %} | {% endif %} {% endif %} {% if has_next %} <a href=’/links/{{ next_page }}’>Next</a> {% endif %} • Pagination is now a wonder to behold!
  • 11. Prep for CRUD (1 of 2) • Before getting into the nitty gritty of CRUD, we need a way to give users feedback for when they create, update, or delete data • One simple way to do this is by passing a message via a GET parameter • To allow this functionality we need to modify our list view to receive messages and modify the list.html template to display messages • Change the first line of the list view in views.py, adding a parameter for messages: def list(request, page = 0, message = quot;quot;): • Also in views.py, add a line in the list view so the passed message is included in the list of parameters relayed to the list.html template: ‘message’: message,
  • 12. Prep for CRUD (2 of 2) • Now that we’re preparing to add CRUD functionality, we need to update our list HTML template as shown below: {% if message %} <b>{{ message }}</b> <p> {% endif %} {% if link_list %} <table> {% for link in link_list %} <tr bgcolor='{% cycle FFFFFF,EEEEEE as rowcolor %}'> <td><a href='{{ link.link_url }}'>{{ link.link_description }}</a></td> <td><a href='/links/edit/{{ link.id }}'>Edit</a></td> <td><a href='/links/delete/{{ link.id }}'>Delete</a></td> </tr> {% endfor %} </table> <p> {% if has_previous %} <a href='/links/{{ previous_page }}'>Previous</a> {% if has_next %}|{% endif %} {% endif %} {% if has_next %} <a href='/links/{{ next_page }}'>Next</a> {% endif %} {% else %} <p>No links found.</p> {% endif %} <p> <a href='/links/new'>Add Link</a>
  • 13. Creating Data (1 of 2) • Allowing users to submit data requires first displaying an HTML form then adding the submitted data • To start, add a URL for form display to urls.py: (r’^links/new’, ‘linkdump.linktracker.views.new’) • To deal with the submitted data, we add another URL to urls.py: (r’^links/add/’, ‘linkdump.linktracker.views.add’) • Then, to display an HTML add form in linktracker/views.py, add the following block of code: def new(request): return render_to_reponse( ‘links/form.html’, {‘action’: ‘add’, ‘button’: ‘Add’} )
  • 14. Creating Data (2 of 2) • Next, we add the form HTML template (which, as written below, can be used for adding or editing, as we’ll see later): <form action=’/links/{{ action }}/’ method=’post’> Description: <input name=link_description value=”{{ link.link_description|escape}}”><br /> URL: <input name=link_url value=’{{ link.link_url|escape }}’><br /> <input type=submit value=’{{ button }}’> </form> • Finally, we add logic to linktracker/views.py to add the submitted data then return to the list view, passing a message: def add(request): link_description = request.POST[“link_description”] link_url = request.POST[“link_url”] link = Link( link_description = link_description, link_url = link_url ) link.save() return list(request, message=”Link added!”)
  • 15. Updating Data (1 of 2) • Allowing users to upate data requires first displaying an HTML form showing current data then, upon submission, doing the actual update • To start, add a URL for form display to urls.py: (r’^links/edit/(?P<id>d+)’, ‘linkdump.linktracker.views.edit’) • Then, to display an HTML edit form in linktracker/views.py, add the following block of code: def edit(request, id): link = Link.objects.get(id=id) return render_to_reponse( ‘links/form.html’, {‘action’: ‘update/’ + id, ‘button’: ‘Update’} ) • NOTE: As the HTML form we added earlier can be used to edit, we’re re- using it in the above code
  • 16. Updating Data (2 of 2) • To deal with submitted updates, we add another URL to urls.py: (r’^links/update/(?P<id>d+)’, ‘linkdump.linktracker.views.update’) • Finally, we add logic to linktracker/views.py to add the submitted data then return to the list view, passing a message: def update(request, id): link = Link.objects.get(id=id) link.link_description = request.POST[“link_description”] link.link_url = request.POST[“link_url”] link.save() return list(request, message=”Link updated!”)
  • 17. Deleting Data • Allowing users to delete data requires first displaying an HTML form showing current data then, upon submission, doing the actual update • To support deletion, add a new URL pattern to urls.py: (r'^links/delete/(?P<id>d+)', 'diglic.links.views.delete') • Then, to display an HTML edit form in linktracker/views.py, add the following block of code: def delete(request, id): Link.objects.get(id=id).delete() return list(request, message=”Link deleted!”)