SlideShare ist ein Scribd-Unternehmen logo
1 von 17
Downloaden Sie, um offline zu lesen
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!”)

Weitere ähnliche Inhalte

Was ist angesagt?

Python Dictionaries and Sets
Python Dictionaries and SetsPython Dictionaries and Sets
Python Dictionaries and SetsNicole Ryan
 
Database Connectivity in PHP
Database Connectivity in PHPDatabase Connectivity in PHP
Database Connectivity in PHPTaha Malampatti
 
Introduction to CSS
Introduction to CSSIntroduction to CSS
Introduction to CSSAmit Tyagi
 
PHP Form Validation Technique
PHP Form Validation TechniquePHP Form Validation Technique
PHP Form Validation TechniqueMorshedul Arefin
 
Arrays In Python | Python Array Operations | Edureka
Arrays In Python | Python Array Operations | EdurekaArrays In Python | Python Array Operations | Edureka
Arrays In Python | Python Array Operations | EdurekaEdureka!
 
Python Web Development Tutorial | Web Development Using Django | Edureka
Python Web Development Tutorial | Web Development Using Django | EdurekaPython Web Development Tutorial | Web Development Using Django | Edureka
Python Web Development Tutorial | Web Development Using Django | EdurekaEdureka!
 
Client-side JavaScript
Client-side JavaScriptClient-side JavaScript
Client-side JavaScriptLilia Sfaxi
 
Event In JavaScript
Event In JavaScriptEvent In JavaScript
Event In JavaScriptShahDhruv21
 
cascading style sheet ppt
cascading style sheet pptcascading style sheet ppt
cascading style sheet pptabhilashagupta
 
JavaScript Tutorial
JavaScript  TutorialJavaScript  Tutorial
JavaScript TutorialBui Kiet
 

Was ist angesagt? (20)

Python Dictionaries and Sets
Python Dictionaries and SetsPython Dictionaries and Sets
Python Dictionaries and Sets
 
HTML Fundamentals
HTML FundamentalsHTML Fundamentals
HTML Fundamentals
 
A tutorial on C++ Programming
A tutorial on C++ ProgrammingA tutorial on C++ Programming
A tutorial on C++ Programming
 
Introduction to php
Introduction to phpIntroduction to php
Introduction to php
 
Database Connectivity in PHP
Database Connectivity in PHPDatabase Connectivity in PHP
Database Connectivity in PHP
 
Javascript validating form
Javascript validating formJavascript validating form
Javascript validating form
 
Flask – Python
Flask – PythonFlask – Python
Flask – Python
 
Introduction to CSS
Introduction to CSSIntroduction to CSS
Introduction to CSS
 
PHP Form Validation Technique
PHP Form Validation TechniquePHP Form Validation Technique
PHP Form Validation Technique
 
Arrays In Python | Python Array Operations | Edureka
Arrays In Python | Python Array Operations | EdurekaArrays In Python | Python Array Operations | Edureka
Arrays In Python | Python Array Operations | Edureka
 
Python Web Development Tutorial | Web Development Using Django | Edureka
Python Web Development Tutorial | Web Development Using Django | EdurekaPython Web Development Tutorial | Web Development Using Django | Edureka
Python Web Development Tutorial | Web Development Using Django | Edureka
 
Client-side JavaScript
Client-side JavaScriptClient-side JavaScript
Client-side JavaScript
 
PHP
PHPPHP
PHP
 
C# in depth
C# in depthC# in depth
C# in depth
 
Event In JavaScript
Event In JavaScriptEvent In JavaScript
Event In JavaScript
 
cascading style sheet ppt
cascading style sheet pptcascading style sheet ppt
cascading style sheet ppt
 
Html
HtmlHtml
Html
 
JavaScript Tutorial
JavaScript  TutorialJavaScript  Tutorial
JavaScript Tutorial
 
Xhtml
XhtmlXhtml
Xhtml
 
ASP.NET Lecture 1
ASP.NET Lecture 1ASP.NET Lecture 1
ASP.NET Lecture 1
 

Andere mochten auch

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
 

Andere mochten auch (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
 

Ähnlich wie 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
 

Ähnlich wie 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
 

Kürzlich hochgeladen

Visualising and forecasting stocks using Dash
Visualising and forecasting stocks using DashVisualising and forecasting stocks using Dash
Visualising and forecasting stocks using Dashnarutouzumaki53779
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxBkGupta21
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESSALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESmohitsingh558521
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersNicole Novielli
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxLoriGlavin3
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demoHarshalMandlekar2
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteDianaGray10
 

Kürzlich hochgeladen (20)

Visualising and forecasting stocks using Dash
Visualising and forecasting stocks using DashVisualising and forecasting stocks using Dash
Visualising and forecasting stocks using Dash
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptx
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESSALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software Developers
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptx
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demo
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test Suite
 

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