SlideShare a Scribd company logo
1 of 17
Download to read offline
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!”)

More Related Content

What's hot (20)

Serialization/deserialization
Serialization/deserializationSerialization/deserialization
Serialization/deserialization
 
Wrapper class
Wrapper classWrapper class
Wrapper class
 
Regular expressions in Python
Regular expressions in PythonRegular expressions in Python
Regular expressions in Python
 
Java interfaces
Java interfacesJava interfaces
Java interfaces
 
Object-oriented Programming-with C#
Object-oriented Programming-with C#Object-oriented Programming-with C#
Object-oriented Programming-with C#
 
Database Connectivity in PHP
Database Connectivity in PHPDatabase Connectivity in PHP
Database Connectivity in PHP
 
Class 5 - PHP Strings
Class 5 - PHP StringsClass 5 - PHP Strings
Class 5 - PHP Strings
 
JavaScript - Chapter 9 - TypeConversion and Regular Expressions
 JavaScript - Chapter 9 - TypeConversion and Regular Expressions  JavaScript - Chapter 9 - TypeConversion and Regular Expressions
JavaScript - Chapter 9 - TypeConversion and Regular Expressions
 
Java Collections
Java  Collections Java  Collections
Java Collections
 
Rest api with Python
Rest api with PythonRest api with Python
Rest api with Python
 
SQLITE Android
SQLITE AndroidSQLITE Android
SQLITE Android
 
Python Tutorial Part 2
Python Tutorial Part 2Python Tutorial Part 2
Python Tutorial Part 2
 
OOP with Java - Continued
OOP with Java - Continued OOP with Java - Continued
OOP with Java - Continued
 
Strings in Java
Strings in JavaStrings in Java
Strings in Java
 
Java IO
Java IOJava IO
Java IO
 
Introduction to Django Rest Framework
Introduction to Django Rest FrameworkIntroduction to Django Rest Framework
Introduction to Django Rest Framework
 
Java Threads and Concurrency
Java Threads and ConcurrencyJava Threads and Concurrency
Java Threads and Concurrency
 
Collections In Java
Collections In JavaCollections In Java
Collections In Java
 
Object oriented programming in python
Object oriented programming in pythonObject oriented programming in python
Object oriented programming in python
 
JDBC - JPA - Spring Data
JDBC - JPA - Spring DataJDBC - JPA - Spring Data
JDBC - JPA - Spring Data
 

Viewers also liked

Not Only Drupal
Not Only DrupalNot Only Drupal
Not Only Drupalmcantelon
 
Sphinx: Leveraging Scalable Search in Drupal
Sphinx: Leveraging Scalable Search in DrupalSphinx: Leveraging Scalable Search in Drupal
Sphinx: Leveraging Scalable Search in Drupalelliando dias
 
CodeFest 2014. Егоров В. — Что за… Dart?
CodeFest 2014. Егоров В. — Что за… Dart?CodeFest 2014. Егоров В. — Что за… Dart?
CodeFest 2014. Егоров В. — Что за… Dart?CodeFest
 
개발자를 위한 Amazon Lightsail Deep-Dive - 정창훈(당근마켓)
개발자를 위한 Amazon Lightsail Deep-Dive - 정창훈(당근마켓)개발자를 위한 Amazon Lightsail Deep-Dive - 정창훈(당근마켓)
개발자를 위한 Amazon Lightsail Deep-Dive - 정창훈(당근마켓)AWSKRUG - AWS한국사용자모임
 
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 practicesStoyan Stefanov
 
Modul pelatihan-django-dasar-possupi-v1
Modul pelatihan-django-dasar-possupi-v1Modul pelatihan-django-dasar-possupi-v1
Modul pelatihan-django-dasar-possupi-v1Ridwan Fadjar
 
MetaZeta Clusters Overview
MetaZeta Clusters OverviewMetaZeta Clusters Overview
MetaZeta Clusters OverviewPaul Baclace
 
Computational genomics approaches to precision medicine
Computational genomics approaches to precision medicineComputational genomics approaches to precision medicine
Computational genomics approaches to precision medicineAltuna Akalin
 
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)Altuna Akalin
 
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 AnalyticsNavisro 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 CommerceDaniel Greenfeld
 
The Physics of Fast Image Compression
The Physics of Fast Image CompressionThe Physics of Fast Image Compression
The Physics of Fast Image CompressionCloudinary
 
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)Chris Aniszczyk
 
Keynote: Apache HBase at Yahoo! Scale
Keynote: Apache HBase at Yahoo! ScaleKeynote: Apache HBase at Yahoo! Scale
Keynote: Apache HBase at Yahoo! ScaleHBaseCon
 
An Abusive Relationship with AngularJS
An Abusive Relationship with AngularJSAn Abusive Relationship with AngularJS
An Abusive Relationship with AngularJSMario Heiderich
 
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 EducatorsCode.org Teacher Community
 

Viewers also liked (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 to Basic Crud In Django

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 exampleKaty Slemon
 
The Django Web Application Framework 2
The Django Web Application Framework 2The Django Web Application Framework 2
The Django Web Application Framework 2fishwarter
 
The Django Web Application Framework 2
The Django Web Application Framework 2The Django Web Application Framework 2
The Django Web Application Framework 2fishwarter
 
The Django Web Application Framework 2
The Django Web Application Framework 2The Django Web Application Framework 2
The Django Web Application Framework 2fishwarter
 
The Django Web Application Framework 2
The Django Web Application Framework 2The Django Web Application Framework 2
The Django Web Application Framework 2fishwarter
 
Task scheduling in laravel 8 tutorial
Task scheduling in laravel 8 tutorialTask scheduling in laravel 8 tutorial
Task scheduling in laravel 8 tutorialKaty Slemon
 
Ruby on rails3 - introduction to rails
Ruby on rails3 - introduction to railsRuby on rails3 - introduction to rails
Ruby on rails3 - introduction to railsEmad Elsaid
 
TurboGears2 Pluggable Applications
TurboGears2 Pluggable ApplicationsTurboGears2 Pluggable Applications
TurboGears2 Pluggable ApplicationsAlessandro Molina
 
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/4DEVCON
 
Build and deploy Python Django project
Build and deploy Python Django projectBuild and deploy Python Django project
Build and deploy Python Django projectXiaoqi Zhao
 
Working With Sharepoint 2013 Apps Development
Working With Sharepoint 2013 Apps DevelopmentWorking With Sharepoint 2013 Apps Development
Working With Sharepoint 2013 Apps DevelopmentPankaj Srivastava
 
Useful Rails Plugins
Useful Rails PluginsUseful Rails Plugins
Useful Rails Pluginsnavjeet
 
ASP.NET MVC introduction
ASP.NET MVC introductionASP.NET MVC introduction
ASP.NET MVC introductionTomi Juhola
 
Introduction to Django
Introduction to DjangoIntroduction to Django
Introduction to DjangoJoaquim Rocha
 
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 HandlingWebStackAcademy
 

Similar to 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
 
Language literacy
Language literacyLanguage literacy
Language literacy
 
Lecture n
Lecture nLecture n
Lecture n
 
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
 

Recently uploaded

Introduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptxIntroduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptxMatsuo Lab
 
AI Fame Rush Review – Virtual Influencer Creation In Just Minutes
AI Fame Rush Review – Virtual Influencer Creation In Just MinutesAI Fame Rush Review – Virtual Influencer Creation In Just Minutes
AI Fame Rush Review – Virtual Influencer Creation In Just MinutesMd Hossain Ali
 
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdfUiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdfDianaGray10
 
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdf
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdf
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdfJamie (Taka) Wang
 
Empowering Africa's Next Generation: The AI Leadership Blueprint
Empowering Africa's Next Generation: The AI Leadership BlueprintEmpowering Africa's Next Generation: The AI Leadership Blueprint
Empowering Africa's Next Generation: The AI Leadership BlueprintMahmoud Rabie
 
Nanopower In Semiconductor Industry.pdf
Nanopower  In Semiconductor Industry.pdfNanopower  In Semiconductor Industry.pdf
Nanopower In Semiconductor Industry.pdfPedro Manuel
 
Cybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptxCybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptxGDSC PJATK
 
Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )Brian Pichman
 
VoIP Service and Marketing using Odoo and Asterisk PBX
VoIP Service and Marketing using Odoo and Asterisk PBXVoIP Service and Marketing using Odoo and Asterisk PBX
VoIP Service and Marketing using Odoo and Asterisk PBXTarek Kalaji
 
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...Aggregage
 
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019IES VE
 
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPAAnypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPAshyamraj55
 
Comparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioComparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioChristian Posta
 
20230202 - Introduction to tis-py
20230202 - Introduction to tis-py20230202 - Introduction to tis-py
20230202 - Introduction to tis-pyJamie (Taka) Wang
 
Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024SkyPlanner
 
Building AI-Driven Apps Using Semantic Kernel.pptx
Building AI-Driven Apps Using Semantic Kernel.pptxBuilding AI-Driven Apps Using Semantic Kernel.pptx
Building AI-Driven Apps Using Semantic Kernel.pptxUdaiappa Ramachandran
 
UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8DianaGray10
 
Computer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsComputer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsSeth Reyes
 
COMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a WebsiteCOMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a Websitedgelyza
 
AI You Can Trust - Ensuring Success with Data Integrity Webinar
AI You Can Trust - Ensuring Success with Data Integrity WebinarAI You Can Trust - Ensuring Success with Data Integrity Webinar
AI You Can Trust - Ensuring Success with Data Integrity WebinarPrecisely
 

Recently uploaded (20)

Introduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptxIntroduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptx
 
AI Fame Rush Review – Virtual Influencer Creation In Just Minutes
AI Fame Rush Review – Virtual Influencer Creation In Just MinutesAI Fame Rush Review – Virtual Influencer Creation In Just Minutes
AI Fame Rush Review – Virtual Influencer Creation In Just Minutes
 
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdfUiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
 
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdf
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdf
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdf
 
Empowering Africa's Next Generation: The AI Leadership Blueprint
Empowering Africa's Next Generation: The AI Leadership BlueprintEmpowering Africa's Next Generation: The AI Leadership Blueprint
Empowering Africa's Next Generation: The AI Leadership Blueprint
 
Nanopower In Semiconductor Industry.pdf
Nanopower  In Semiconductor Industry.pdfNanopower  In Semiconductor Industry.pdf
Nanopower In Semiconductor Industry.pdf
 
Cybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptxCybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptx
 
Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )
 
VoIP Service and Marketing using Odoo and Asterisk PBX
VoIP Service and Marketing using Odoo and Asterisk PBXVoIP Service and Marketing using Odoo and Asterisk PBX
VoIP Service and Marketing using Odoo and Asterisk PBX
 
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
 
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
 
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPAAnypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPA
 
Comparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioComparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and Istio
 
20230202 - Introduction to tis-py
20230202 - Introduction to tis-py20230202 - Introduction to tis-py
20230202 - Introduction to tis-py
 
Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024
 
Building AI-Driven Apps Using Semantic Kernel.pptx
Building AI-Driven Apps Using Semantic Kernel.pptxBuilding AI-Driven Apps Using Semantic Kernel.pptx
Building AI-Driven Apps Using Semantic Kernel.pptx
 
UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8
 
Computer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsComputer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and Hazards
 
COMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a WebsiteCOMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a Website
 
AI You Can Trust - Ensuring Success with Data Integrity Webinar
AI You Can Trust - Ensuring Success with Data Integrity WebinarAI You Can Trust - Ensuring Success with Data Integrity Webinar
AI You Can Trust - Ensuring Success with Data Integrity Webinar
 

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!”)