johnmahugu

Python - Django CRUD

Jun 11th, 2015
378
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.08 KB | None | 0 0
  1.  
  2. Django CRUD (Create, Retrieve, Update, Delete)
  3.  
  4. UPDATE: The main example use Class Based Views, I also added Function Based Views version of the same thing at the end of post.
  5.  
  6. Sample Code: You can download a sample application from https://github.com/rayed/django_crud
  7.  
  8. In this post I briefly cover the step needed to create a CRUD app in Django, the steps we will need are:
  9.  
  10. Create an App
  11. Create the Model
  12. Create the Admin Interface (optional)
  13. Create the View
  14. Define the URLs (i.e. URL to View mapping)
  15. Create the Templates
  16.  
  17. Create new App
  18.  
  19. From the Django project directory we will create the new app called “servers” to store our servers information:
  20.  
  21. ./manage.py startapp servers
  22.  
  23. We will also need to register the new app in our Django project, add the app ‘server’ to the INSTALLED_APPS in your django_proj_name/settings.py:
  24.  
  25. INSTALLED_APPS = (
  26. :
  27. 'servers',
  28. :
  29. )
  30.  
  31. Create the Model
  32.  
  33. The model file would be servers/models.py:
  34.  
  35. from django.db import models
  36. from django.core.urlresolvers import reverse
  37.  
  38. class Server(models.Model):
  39. name = models.CharField(max_length=200)
  40. ip = models.GenericIPAddressField()
  41. order = models.IntegerField()
  42.  
  43. def __unicode__(self):
  44. return self.name
  45.  
  46. def get_absolute_url(self):
  47. return reverse('server_edit', kwargs={'pk': self.pk})
  48.  
  49. After defining the model issue the command:
  50.  
  51. ./manage.py syncdb
  52.  
  53. To create the table for the new model.
  54. Admin Interface (optional)
  55.  
  56. Django will give you free CRUD interface from the admin site, just define the file servers/admin.py as:
  57.  
  58. from django.contrib import admin
  59. from servers.models import Server
  60.  
  61. admin.site.register(Server)
  62.  
  63. The Views
  64.  
  65. We will use Django Class-based views to crete our app pages, the file servers/views.py would look like:
  66.  
  67. from django.http import HttpResponse
  68. from django.views.generic import TemplateView,ListView
  69. from django.views.generic.edit import CreateView, UpdateView, DeleteView
  70. from django.core.urlresolvers import reverse_lazy
  71.  
  72. from servers.models import Server
  73.  
  74. class ServerList(ListView):
  75. model = Server
  76.  
  77. class ServerCreate(CreateView):
  78. model = Server
  79. success_url = reverse_lazy('server_list')
  80. fields = ['name', 'ip', 'order']
  81.  
  82. class ServerUpdate(UpdateView):
  83. model = Server
  84. success_url = reverse_lazy('server_list')
  85. fields = ['name', 'ip', 'order']
  86.  
  87. class ServerDelete(DeleteView):
  88. model = Server
  89. success_url = reverse_lazy('server_list')
  90.  
  91. Define the URLs
  92.  
  93. We need to define app URLs in the file __servers/urls.py:
  94.  
  95. from django.conf.urls import patterns, url
  96.  
  97. from servers import views
  98.  
  99. urlpatterns = patterns('',
  100. url(r'^$', views.ServerList.as_view(), name='server_list'),
  101. url(r'^new$', views.ServerCreate.as_view(), name='server_new'),
  102. url(r'^edit/(?P<pk>\d+)$', views.ServerUpdate.as_view(), name='server_edit'),
  103. url(r'^delete/(?P<pk>\d+)$', views.ServerDelete.as_view(), name='server_delete'),
  104. )
  105.  
  106. This URLs wouldn’t work unless you include the servers/urls.py in the main URLs file django_proj_name/urls.py:
  107.  
  108. urlpatterns = patterns('',
  109. :
  110. url(r'^servers/', include('servers.urls')),
  111. :
  112. )
  113.  
  114. Templates
  115.  
  116. templates/servers/server_form.html This file will be used by Edit and Update views:
  117.  
  118. <form method="post">{% csrf_token %}
  119. {{ form.as_p }}
  120. <input type="submit" value="Submit" />
  121. </form>
  122.  
  123. templates/servers/server_list.html This file will be used by the ListView:
  124.  
  125. <h1>Servers</h1>
  126. <ul>
  127. {% for server in object_list %}
  128. <li>{{ server.name }} :
  129. <a href="{% url "server_edit" server.id %}">{{ server.ip }}</a>
  130. <a href="{% url "server_delete" server.id %}">delete</a>
  131. </li>
  132. {% endfor %}
  133. </ul>
  134.  
  135. <a href="{% url "server_new" %}">New</a>
  136.  
  137. templates/servers/server_confirm_delete.html This file will be used by DeleteView:
  138.  
  139. <form method="post">{% csrf_token %}
  140. Are you sure you want to delete "{{ object }}" ?
  141. <input type="submit" value="Submit" />
  142. </form>
  143.  
  144. Function Based View Version
  145.  
  146. The example above uses Class Based Views (or CBV for short) to implement the views, what I will cover now is how to implement the same functionality but with Function Based Views i.e. using functions instead of classes, we will be using the same templates:
  147.  
  148. servers/views.py:
  149.  
  150. from django.shortcuts import render, redirect, get_object_or_404
  151. from django.forms import ModelForm
  152.  
  153. from servers.models import Server
  154.  
  155. class ServerForm(ModelForm):
  156. class Meta:
  157. model = Server
  158. fields = ['name', 'ip', 'order']
  159.  
  160. def server_list(request, template_name='servers/server_list.html'):
  161. servers = Server.objects.all()
  162. data = {}
  163. data['object_list'] = servers
  164. return render(request, template_name, data)
  165.  
  166. def server_create(request, template_name='servers/server_form.html'):
  167. form = ServerForm(request.POST or None)
  168. if form.is_valid():
  169. form.save()
  170. return redirect('server_list')
  171. return render(request, template_name, {'form':form})
  172.  
  173. def server_update(request, pk, template_name='servers/server_form.html'):
  174. server = get_object_or_404(Server, pk=pk)
  175. form = ServerForm(request.POST or None, instance=server)
  176. if form.is_valid():
  177. form.save()
  178. return redirect('server_list')
  179. return render(request, template_name, {'form':form})
  180.  
  181. def server_delete(request, pk, template_name='servers/server_confirm_delete.html'):
  182. server = get_object_or_404(Server, pk=pk)
  183. if request.method=='POST':
  184. server.delete()
  185. return redirect('server_list')
  186. return render(request, template_name, {'object':server})
  187.  
  188. servers/urls.py:
  189.  
  190. from django.conf.urls import patterns, url
  191.  
  192. from servers import views
  193.  
  194. urlpatterns = patterns('',
  195. url(r'^$', views.server_list, name='server_list'),
  196. url(r'^new$', views.server_create, name='server_new'),
  197. url(r'^edit/(?P<pk>\d+)$', views.server_update, name='server_edit'),
  198. url(r'^delete/(?P<pk>\d+)$', views.server_delete, name='server_delete'),
  199. )
  200.  
  201. p.s. personally I prefer using FBV over CBV, the article Django’s CBVs were a mistake explains why.
Advertisement
Add Comment
Please, Sign In to add comment