Project Development

Version 87 (Etienne Pallier, 04/01/2016 11:37 am)

1 1 Etienne Pallier
h1. Project Development
2 2 Etienne Pallier
3 17 Etienne Pallier
Project Installation page : [[Project Installation]]
4 2 Etienne Pallier
5 2 Etienne Pallier
HOWTO Format Redmine Wiki : http://www.redmine.org/projects/redmine/wiki/FrRedmineWikiFormatting
6 2 Etienne Pallier
7 84 Paul Carensac
Project's applications : [[Pyros applications]]
8 84 Paul Carensac
9 2 Etienne Pallier
{{>toc}}
10 2 Etienne Pallier
11 2 Etienne Pallier
---
12 3 Etienne Pallier
13 3 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}TODO%
14 3 Etienne Pallier
15 1 Etienne Pallier
16 1 Etienne Pallier
17 70 Etienne Pallier
 cf Roadmap
18 35 Etienne Pallier
19 3 Etienne Pallier
20 3 Etienne Pallier
21 57 Etienne Pallier
22 56 Etienne Pallier
---
23 24 Etienne Pallier
24 3 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}LIENS UTILES%
25 70 Etienne Pallier
26 70 Etienne Pallier
27 70 Etienne Pallier
 * pyrossu : pyrossu!
28 4 Etienne Pallier
29 86 Etienne Pallier
 * Alexandru work: https://projects.irap.omp.eu/projects/gft/wiki/Documentation_technique_projet#Fetch-the-project-from-github-via-git
30 86 Etienne Pallier
31 71 Etienne Pallier
 * readonly admin interface : https://gist.github.com/aaugustin/1388243
32 71 Etienne Pallier
33 4 Etienne Pallier
 * Liens vers web local :
34 4 Etienne Pallier
35 4 Etienne Pallier
  * homepage: http://localhost:8000
36 4 Etienne Pallier
  * admin: http://localhost:8000/admin
37 25 Etienne Pallier
38 25 Etienne Pallier
 * Eclipse:
39 26 Etienne Pallier
 
40 26 Etienne Pallier
  * Shift-Ctrl-f (ou Shift-Cmd-f) : reformatage du fichier selon PEP8
41 25 Etienne Pallier
  * Shift-Ctrl-1 : make doc string ...
42 4 Etienne Pallier
43 4 Etienne Pallier
 * Django:
44 4 Etienne Pallier
45 80 Etienne Pallier
  * Un répertoire de modules : https://www.djangopackages.com/
46 79 Etienne Pallier
  * Extensions
47 1 Etienne Pallier
48 1 Etienne Pallier
   * *django_jenkins* : intégration à Jenkins
49 83 Etienne Pallier
   * *factory_boy* : création de grappes de données pour les tests
50 83 Etienne Pallier
   
51 83 Etienne Pallier
    * https://factoryboy.readthedocs.org/en/latest/introduction.html
52 83 Etienne Pallier
    * https://factoryboy.readthedocs.org/en/latest/orms.html 
53 79 Etienne Pallier
54 79 Etienne Pallier
  * Modules très utilisés:
55 79 Etienne Pallier
56 79 Etienne Pallier
   * django_linaration_pagination : affichage de listes paginées
57 79 Etienne Pallier
   * django_sorting : affichage de tableaux triables
58 79 Etienne Pallier
   * django_breadcrumbs : création de fil d'ariane
59 79 Etienne Pallier
   * django_xworkflows : gestion de workflows
60 79 Etienne Pallier
   * easy_thumbnails : gestion de miniatures pour les images
61 79 Etienne Pallier
62 38 Etienne Pallier
  * Coding style: https://docs.djangoproject.com/en/dev/internals/contributing/writing-code/coding-style
63 81 Etienne Pallier
64 82 Etienne Pallier
  * Doc : *https://docs.djangoproject.com/fr (EN FRANCAIS)*
65 1 Etienne Pallier
66 82 Etienne Pallier
   * https://docs.djangoproject.com (EN)
67 82 Etienne Pallier
   * http://www.django-fr.org/planete
68 72 Etienne Pallier
   * https://docs.djangoproject.com/en/1.9/howto/deployment
69 72 Etienne Pallier
   * test fixtures : https://docs.djangoproject.com/en/1.9/howto/initial-data/
70 72 Etienne Pallier
   * managing static files: https://docs.djangoproject.com/en/1.9/howto/static-files/
71 72 Etienne Pallier
   * deploying static files: https://docs.djangoproject.com/en/1.9/howto/static-files/deployment/
72 72 Etienne Pallier
   * install on Windows: https://docs.djangoproject.com/en/1.9/howto/windows/
73 72 Etienne Pallier
   * writing migrations: https://docs.djangoproject.com/en/1.9/howto/writing-migrations/
74 72 Etienne Pallier
   * migrations : https://docs.djangoproject.com/en/1.9/topics/migrations/
75 72 Etienne Pallier
   * Django settings: https://docs.djangoproject.com/en/1.9/topics/settings/
76 1 Etienne Pallier
   * Testing: https://docs.djangoproject.com/en/1.9/topics/testing/
77 72 Etienne Pallier
   * User authentication: https://docs.djangoproject.com/en/1.9/topics/auth/
78 72 Etienne Pallier
79 82 Etienne Pallier
  * Autres ressources:
80 82 Etienne Pallier
81 82 Etienne Pallier
   * django-admin command: https://docs.djangoproject.com/en/1.9/ref/django-admin
82 82 Etienne Pallier
   * http://stackoverflow.com/questions/tagged/django
83 82 Etienne Pallier
   * https://www.djangopackages.com/
84 82 Etienne Pallier
   * http://forum.django-fr.org
85 82 Etienne Pallier
   * La mailing list : django@lists.afpy.org
86 44 Etienne Pallier
87 44 Etienne Pallier
88 72 Etienne Pallier
 * Image processing with Python : https://pillow.readthedocs.org/en/latest/handbook/overview.html
89 4 Etienne Pallier
90 4 Etienne Pallier
 * Git docs: 
91 19 Etienne Pallier
92 4 Etienne Pallier
  * Permissions gitlab: https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/permissions/permissions.md
93 4 Etienne Pallier
  * https://git-scm.com/docs
94 4 Etienne Pallier
  * https://git-scm.com/book/fr/v1/Les-bases-de-Git-Travailler-avec-des-d%C3%A9p%C3%B4ts-distants
95 4 Etienne Pallier
  * les workflows: https://aresu.dsi.cnrs.fr/spip.php?article219
96 15 Etienne Pallier
  * Git for Eclipse users : http://wiki.eclipse.org/EGit/Git_For_Eclipse_Users
97 4 Etienne Pallier
  * Git sur sourcesup (avec jenkins) : https://services.renater.fr/sourcesup/formation/chap04#gestion_d_un_projet_avec_git_jenkins_sonar_et_nexus
98 4 Etienne Pallier
99 4 Etienne Pallier
 * CADOR web interface: http://cador.obs-hp.fr/ros/manual/cador_actions.html
100 4 Etienne Pallier
101 4 Etienne Pallier
 * pylint (analyse de code) : https://www.pylint.org
102 4 Etienne Pallier
103 4 Etienne Pallier
 * pyreverse (uml diagrams generation, inclus dans pylint) : https://www.logilab.org/blogentry/6883
104 4 Etienne Pallier
105 4 Etienne Pallier
 * tox (a generic virtualenv management and test command line tool) : https://testrun.org/tox/latest/index.html
106 4 Etienne Pallier
107 5 Etienne Pallier
---
108 5 Etienne Pallier
109 5 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}I - DATABASE SCHEMA (v0.2.1)%
110 5 Etienne Pallier
111 5 Etienne Pallier
112 6 Etienne Pallier
{{thumbnail(PYROS_PDM_v021.png, size=300, title=Pyros data model)}}
113 7 Etienne Pallier
114 6 Etienne Pallier
---
115 7 Etienne Pallier
116 6 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}II - Get the project (from gitlab)%
117 20 Etienne Pallier
118 20 Etienne Pallier
h3. Gitlab management interface
119 20 Etienne Pallier
120 20 Etienne Pallier
https://gitlab.irap.omp.eu/epallier/pyros
121 20 Etienne Pallier
122 20 Etienne Pallier
https://gitlab.irap.omp.eu/epallier/pyros/team
123 20 Etienne Pallier
124 6 Etienne Pallier
h3. Get the project
125 8 Etienne Pallier
126 8 Etienne Pallier
https://projects.irap.omp.eu/projects/pyros/wiki/Project_Installation#II-Get-the-project-from-gitlab
127 7 Etienne Pallier
128 7 Etienne Pallier
---
129 11 Etienne Pallier
130 11 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}III - INSTALLATION%
131 11 Etienne Pallier
132 11 Etienne Pallier
https://projects.irap.omp.eu/projects/pyros/wiki/Project_Installation#III-INSTALLATION
133 11 Etienne Pallier
134 11 Etienne Pallier
---
135 6 Etienne Pallier
136 6 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}IV - CONFIGURATION of the Django Back Office (administration interface)%
137 6 Etienne Pallier
138 6 Etienne Pallier
[[django_backoffice_config|Configuration of the Django Back office (admin)]]
139 9 Etienne Pallier
140 9 Etienne Pallier
---
141 13 Etienne Pallier
142 43 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}V - EVOLUTION OF THE PROJECT%
143 1 Etienne Pallier
144 43 Etienne Pallier
145 43 Etienne Pallier
146 43 Etienne Pallier
h3. Linking the User model to the django's one
147 43 Etienne Pallier
148 43 Etienne Pallier
* Modifications in models.py :
149 43 Etienne Pallier
150 43 Etienne Pallier
    * Rename User model to PyrosUser
151 43 Etienne Pallier
    * Rename user table name to pyros_user
152 43 Etienne Pallier
    * Change all occurences (User -> PyrosUser, users -> pyros_users, ...)
153 43 Etienne Pallier
    * from django.contrib.auth.models import User <== add at the beginning of the file
154 43 Etienne Pallier
    * user = models.OneToOneField(User, on_delete=models.CASCADE) <== add this field in PyrosUser declaration
155 43 Etienne Pallier
    * delete fields in PyrosUser : name, firstname, email, login, pass
156 43 Etienne Pallier
157 43 Etienne Pallier
* Modifications in admin.py :
158 43 Etienne Pallier
159 43 Etienne Pallier
    * Change all occurences (User* -> PyrosUser*, users -> pyros_users, ...)
160 43 Etienne Pallier
161 43 Etienne Pallier
<pre>
162 43 Etienne Pallier
$ python manage.py makemigrations pyrosapp
163 43 Etienne Pallier
$ python manage.py migrate
164 43 Etienne Pallier
</pre>
165 43 Etienne Pallier
166 43 Etienne Pallier
---
167 43 Etienne Pallier
168 43 Etienne Pallier
h3. Manage static files (for admin but also for each application)
169 41 Etienne Pallier
170 41 Etienne Pallier
./manage.py runserver
171 41 Etienne Pallier
172 41 Etienne Pallier
if DEBUG=False, we have errors, missing static files :
173 41 Etienne Pallier
174 41 Etienne Pallier
<pre>
175 41 Etienne Pallier
Not Found: /static/admin/css/base.css
176 41 Etienne Pallier
Not Found: /static/admin/css/login.css
177 41 Etienne Pallier
Not Found: /admin/login
178 41 Etienne Pallier
Not Found: /static/admin/css/base.css
179 41 Etienne Pallier
Not Found: /static/admin/css/login.css
180 41 Etienne Pallier
Not Found: /static/admin/css/base.css
181 41 Etienne Pallier
Not Found: /static/admin/css/login.css
182 41 Etienne Pallier
Not Found: /static/admin/css/base.css
183 41 Etienne Pallier
Not Found: /static/admin/css/dashboard.css
184 41 Etienne Pallier
Not Found: /static/admin/css/base.css
185 41 Etienne Pallier
Not Found: /static/admin/css/base.css
186 41 Etienne Pallier
187 41 Etienne Pallier
</pre>
188 41 Etienne Pallier
189 41 Etienne Pallier
190 41 Etienne Pallier
=> We have to activate the static files management
191 41 Etienne Pallier
192 41 Etienne Pallier
(see https://docs.djangoproject.com/en/1.9/howto/static-files)
193 41 Etienne Pallier
194 41 Etienne Pallier
In pyros/urls.py, add this:
195 41 Etienne Pallier
<pre>
196 41 Etienne Pallier
197 41 Etienne Pallier
from django.conf import settings
198 41 Etienne Pallier
from django.conf.urls.static import static
199 41 Etienne Pallier
200 41 Etienne Pallier
urlpatterns = [
201 41 Etienne Pallier
    url(r'^admin/', admin.site.urls),
202 41 Etienne Pallier
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
203 41 Etienne Pallier
</pre>
204 41 Etienne Pallier
205 41 Etienne Pallier
STATIC_ROOT must be defined in settings and says where is the root of all static files
206 41 Etienne Pallier
207 41 Etienne Pallier
Edit settings.py, add:
208 41 Etienne Pallier
<pre>
209 41 Etienne Pallier
STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), 'public', 'static')
210 41 Etienne Pallier
</pre>
211 41 Etienne Pallier
212 41 Etienne Pallier
213 41 Etienne Pallier
./manage.py collectstatic
214 41 Etienne Pallier
215 41 Etienne Pallier
=> 56 static files copied to '.../PYROS/public/static'
216 41 Etienne Pallier
217 41 Etienne Pallier
(in fact it is in public/static/admin/)
218 41 Etienne Pallier
219 41 Etienne Pallier
Cette commande copie tous les fichiers statiques de toutes les applis
220 41 Etienne Pallier
dans public/static
221 41 Etienne Pallier
222 41 Etienne Pallier
Apache viendra lire ce dossier unique
223 41 Etienne Pallier
224 41 Etienne Pallier
A chq changement d’un fichier statique d’une appli, exécuter « collectstatic » pour mettre à jour le dossier final public/static (auquel on ne doit pas toucher manuellement, c’est un dossier « final »)
225 41 Etienne Pallier
226 41 Etienne Pallier
227 39 Etienne Pallier
---
228 39 Etienne Pallier
229 45 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}DJANGO SHELL (top cool)%
230 45 Etienne Pallier
231 51 Etienne Pallier
cf page 60 for the ORM methods
232 51 Etienne Pallier
233 45 Etienne Pallier
<pre>
234 45 Etienne Pallier
./manage.py shell
235 45 Etienne Pallier
Python 3.5.1 (default, Mar  2 2016, 03:38:02) 
236 45 Etienne Pallier
(InteractiveConsole)
237 46 Etienne Pallier
238 45 Etienne Pallier
>>> import django
239 46 Etienne Pallier
240 45 Etienne Pallier
>>> from pyrosapp.models import *
241 46 Etienne Pallier
242 45 Etienne Pallier
>>> country = Country(name='mexico', quota=1)
243 45 Etienne Pallier
>>> country.save()
244 50 Etienne Pallier
(ajout si pas d’id, modif si id)
245 50 Etienne Pallier
246 45 Etienne Pallier
>>> country = Country(name='france')
247 45 Etienne Pallier
>>> country.save()
248 45 Etienne Pallier
>>> country.pk
249 45 Etienne Pallier
>>> 2
250 45 Etienne Pallier
251 45 Etienne Pallier
>>> countries = Country.objects.all()
252 45 Etienne Pallier
>>> countries.count
253 45 Etienne Pallier
>>> <bound method QuerySet.count of <Country: mexico>, <Country: france>>
254 45 Etienne Pallier
>>> countries.count()
255 45 Etienne Pallier
>>> 2
256 45 Etienne Pallier
>>> print(countries)
257 45 Etienne Pallier
>>> <Country: mexico>, <Country: france>
258 45 Etienne Pallier
>>> print(countries.query)
259 45 Etienne Pallier
>>> SELECT country.id, country.name, country.desc, country.quota FROM country
260 45 Etienne Pallier
261 45 Etienne Pallier
>>> cs = countries.filter(name__icontains='fran')
262 45 Etienne Pallier
>>> print(cs)
263 45 Etienne Pallier
>>> <Country: france>
264 45 Etienne Pallier
265 45 Etienne Pallier
>>> cs = countries.filter(name__startswith='me')
266 45 Etienne Pallier
>>> print(cs)
267 45 Etienne Pallier
>>> <Country: mexico>
268 45 Etienne Pallier
269 45 Etienne Pallier
</pre>
270 45 Etienne Pallier
271 45 Etienne Pallier
272 45 Etienne Pallier
---
273 45 Etienne Pallier
274 47 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}HOWTO (divers)%
275 47 Etienne Pallier
276 64 Etienne Pallier
h3. Models
277 1 Etienne Pallier
278 64 Etienne Pallier
1) Relationships between models (1-1, 1-N, N-M) (p55)
279 1 Etienne Pallier
280 61 Etienne Pallier
models.ManyToManyField : représente une relation de type N-N
281 61 Etienne Pallier
(peu importe de quel côté on le déclare)
282 1 Etienne Pallier
283 61 Etienne Pallier
models.OneToOneField : attention, le sens est important, on n’accèdera d’une table à l’autre que dans un sens
284 48 Etienne Pallier
285 61 Etienne Pallier
task <=> user
286 61 Etienne Pallier
task.user
287 1 Etienne Pallier
user.task_set
288 64 Etienne Pallier
289 64 Etienne Pallier
2) Quelques options pour les champs
290 64 Etienne Pallier
291 64 Etienne Pallier
Chaque type de champ possède ses propres propriétés. Cependant, certaines sont communes et souvent utilisées comme :
292 64 Etienne Pallier
293 64 Etienne Pallier
    verbose_name: label du champ
294 64 Etienne Pallier
    null : valeur NULL autorisée ou non en base de données
295 64 Etienne Pallier
    blank : valeur vide autorisée lors de la validation du champ dans un formulaire
296 64 Etienne Pallier
    default : valeur par défaut pour une nouvelle instance
297 64 Etienne Pallier
    editable : le champ doit-il apparaître automatiquement dans les formulaires
298 64 Etienne Pallier
    ...
299 64 Etienne Pallier
300 64 Etienne Pallier
301 64 Etienne Pallier
302 47 Etienne Pallier
303 47 Etienne Pallier
h3. Pour relier une appli python pure à un projet django :
304 47 Etienne Pallier
305 47 Etienne Pallier
=> Ajouter le src/ dans le pythonpath
306 47 Etienne Pallier
307 47 Etienne Pallier
308 47 Etienne Pallier
h3. Séparer le code métier :
309 47 Etienne Pallier
310 47 Etienne Pallier
=> installer le code métier comme un module via pip
311 47 Etienne Pallier
Couches :
312 47 Etienne Pallier
* présentation
313 47 Etienne Pallier
* métier
314 47 Etienne Pallier
* modèle
315 47 Etienne Pallier
316 49 Etienne Pallier
h3. ORM
317 49 Etienne Pallier
318 49 Etienne Pallier
(cf page 60)
319 49 Etienne Pallier
320 59 Etienne Pallier
<pre>
321 73 Etienne Pallier
b = Book(name='Two scoops of django',
322 73 Etienne Pallier
             release=date(2013, 08, 31))
323 1 Etienne Pallier
b.save()
324 73 Etienne Pallier
=> ajout car pas d’id, 
325 73 Etienne Pallier
326 74 Etienne Pallier
b.name ='Two scoops of django - Best practices'
327 74 Etienne Pallier
b.save()
328 1 Etienne Pallier
=> modif car il y a un id
329 74 Etienne Pallier
330 74 Etienne Pallier
b.delete()
331 1 Etienne Pallier
332 75 Etienne Pallier
Toutes les instances:
333 49 Etienne Pallier
Book.objects.all()
334 49 Etienne Pallier
335 75 Etienne Pallier
Liste filtrée:
336 59 Etienne Pallier
books = Book.objects.filter(
337 49 Etienne Pallier
        release__gte=date(2013, 01, 01)
338 49 Etienne Pallier
      ).exclude(
339 49 Etienne Pallier
        borrowed=True
340 49 Etienne Pallier
      )
341 49 Etienne Pallier
342 49 Etienne Pallier
A! La requete est exécutée le plus tard possible, seulement quand django a vraiment besoin de l’exécuter
343 49 Etienne Pallier
344 75 Etienne Pallier
Liste ordonnée:
345 49 Etienne Pallier
books = Book.objects.exclude(borrowed=True).order_by('title')
346 49 Etienne Pallier
print (books.author)
347 49 Etienne Pallier
348 75 Etienne Pallier
Une instance précise:
349 49 Etienne Pallier
Book.objects.get(pk=12)
350 49 Etienne Pallier
351 77 Etienne Pallier
</pre>
352 75 Etienne Pallier
353 77 Etienne Pallier
354 75 Etienne Pallier
Liens vers objets associés:
355 1 Etienne Pallier
356 1 Etienne Pallier
Retrouver les livres disponibles d'un auteur :
357 77 Etienne Pallier
>> author = Author.objects.get(pk=25)
358 77 Etienne Pallier
>> author.books.filter(borrowed=False)
359 1 Etienne Pallier
(books est le related name déclaré dans la relation manytomany)
360 1 Etienne Pallier
361 1 Etienne Pallier
362 77 Etienne Pallier
363 75 Etienne Pallier
Ajouter un livre à une catégorie :
364 77 Etienne Pallier
>> category = Category.objects.get(pk=5)
365 77 Etienne Pallier
>> book = Book.objects.get(pk=12)
366 77 Etienne Pallier
>> category.books.add(book)
367 75 Etienne Pallier
368 75 Etienne Pallier
Supprimer l'association de livres à une catégorie :
369 77 Etienne Pallier
>> category = Category.objects.get(pk=5)
370 77 Etienne Pallier
>> category.books.clear()
371 47 Etienne Pallier
372 47 Etienne Pallier
---
373 53 Etienne Pallier
374 53 Etienne Pallier
h3. Serveur Web
375 53 Etienne Pallier
376 53 Etienne Pallier
Apache : gère tous les fichiers statiques (images, html…), et délègue les fichiers python au serveur django
377 53 Etienne Pallier
378 53 Etienne Pallier
Moteur web django sera soit du wsgi soit du unicorn
379 53 Etienne Pallier
Par défaut, 1 seul worker, mais on peut en configurer plusieurs,
380 53 Etienne Pallier
l’idéal étant de faire nb coeurs + 1 (le worker maître qui fait le dispatching aux autres)
381 53 Etienne Pallier
382 53 Etienne Pallier
Frontend : Apache ou Ngininx
383 53 Etienne Pallier
Backend : gunicorn (gère facilement des workers) ou uwsgi
384 53 Etienne Pallier
385 53 Etienne Pallier
==> gunicorn library.wsgi
386 53 Etienne Pallier
(à la place de manage runserver ==> A EVITER EN PROD)
387 53 Etienne Pallier
388 53 Etienne Pallier
pip install gunicorn
389 53 Etienne Pallier
390 53 Etienne Pallier
gunicorn library.wsgi
391 53 Etienne Pallier
ou
392 53 Etienne Pallier
gunicorn - - workers 5 library.wsgi
393 53 Etienne Pallier
394 53 Etienne Pallier
(gunicorn == tomcat, serveur d’appli Python)
395 53 Etienne Pallier
396 53 Etienne Pallier
1) URL arrive à Apache, qui dispatche (il gère seul les fichiers statiques, et les fichiers python il les transmet à Django)
397 53 Etienne Pallier
2) le fichier library/urls.py prend le relai pour tout ce qui est django
398 53 Etienne Pallier
399 65 Etienne Pallier
400 65 Etienne Pallier
*On peut ajouter un fichier urls.py pour gérer les urls de l’appli
401 65 Etienne Pallier
(on garde le urls.py général du projet pour gérer les grandes urls):*
402 65 Etienne Pallier
403 1 Etienne Pallier
404 66 Etienne Pallier
<pre>
405 66 Etienne Pallier
Déclaration d'une URL
406 65 Etienne Pallier
407 65 Etienne Pallier
# books/urls.py
408 65 Etienne Pallier
from django.conf.urls import patterns, include, url
409 65 Etienne Pallier
urlpatterns = [
410 65 Etienne Pallier
    url(r'^book_list$', 'books.views.book_list', name='book_list'),
411 65 Etienne Pallier
]
412 65 Etienne Pallier
413 65 Etienne Pallier
Inclusion des URLs de l'application au projet
414 65 Etienne Pallier
415 65 Etienne Pallier
# library/urls.py
416 65 Etienne Pallier
...
417 65 Etienne Pallier
urlpatterns = [
418 65 Etienne Pallier
    ...
419 65 Etienne Pallier
    url(r'^books/', include('books.urls', namespace='books')),
420 1 Etienne Pallier
]
421 60 Etienne Pallier
422 60 Etienne Pallier
</pre>
423 60 Etienne Pallier
424 60 Etienne Pallier
h3. MTV design pattern
425 60 Etienne Pallier
426 60 Etienne Pallier
427 60 Etienne Pallier
MTV == MVC :
428 60 Etienne Pallier
429 60 Etienne Pallier
Model = Model
430 60 Etienne Pallier
Template = View
431 60 Etienne Pallier
View = Controller
432 60 Etienne Pallier
433 60 Etienne Pallier
434 60 Etienne Pallier
CREATION DE LA VUE (en fait, le controleur) : slide 23
435 60 Etienne Pallier
views.py = CONTROLEUR
436 60 Etienne Pallier
437 60 Etienne Pallier
438 60 Etienne Pallier
Template = LA VUE (slide 24)
439 60 Etienne Pallier
(on peut user Jinja à la place du moteur django par défaut)
440 60 Etienne Pallier
441 60 Etienne Pallier
Dans chq appli, on crée un dossier templates/ et un sous-dossier du nom de l’appli/
442 60 Etienne Pallier
(==> todo/templates/todo/)
443 60 Etienne Pallier
444 60 Etienne Pallier
Même principe pour les fichiers statiques :
445 60 Etienne Pallier
src/static/appli1, appli2, appli3…
446 60 Etienne Pallier
447 60 Etienne Pallier
NOMENCLATURE template :
448 60 Etienne Pallier
nommodèle_action.html
449 60 Etienne Pallier
(ex: book_list.html)
450 60 Etienne Pallier
451 60 Etienne Pallier
*On pourrait tout mettre dans le urls.py du projet, MAIS c’est mieux
452 60 Etienne Pallier
de créer un fichier urls.py PAR APPLI, puis de les inclure dans le fichier urls.py principal*
453 60 Etienne Pallier
454 60 Etienne Pallier
Class-based views ==> classes controleurs
455 60 Etienne Pallier
Les méthodes get() et post() sont déjà définies, et on peut les surcharger…
456 60 Etienne Pallier
457 60 Etienne Pallier
Avec un template (gabarit), on peut générer autre chose que du html,
458 60 Etienne Pallier
on peut par ex générer du texte, du pdf, un email, un xml…
459 60 Etienne Pallier
460 60 Etienne Pallier
461 60 Etienne Pallier
462 60 Etienne Pallier
Vue liste (et détail) :
463 60 Etienne Pallier
https://docs.djangoproject.com/fr/1.8/topics/class-based-views/generic-display/
464 60 Etienne Pallier
1) todo/views.py
465 60 Etienne Pallier
from django.views.generic import ListView
466 60 Etienne Pallier
from books.models import Publisher
467 60 Etienne Pallier
468 60 Etienne Pallier
class PublisherList(ListView):
469 60 Etienne Pallier
    model = Publisher
470 60 Etienne Pallier
471 60 Etienne Pallier
472 60 Etienne Pallier
2) todolist/urls.py
473 60 Etienne Pallier
from django.conf.urls import url
474 60 Etienne Pallier
from books.views import PublisherList
475 60 Etienne Pallier
476 60 Etienne Pallier
urlpatterns = [
477 60 Etienne Pallier
    url(r'^publishers/$', PublisherList.as_view()),
478 60 Etienne Pallier
]
479 60 Etienne Pallier
480 60 Etienne Pallier
3) todo/templates/todo/
481 60 Etienne Pallier
482 60 Etienne Pallier
483 60 Etienne Pallier
484 60 Etienne Pallier
- Vue Liste : par défaut le template reçoit un objet « objects_list »
485 53 Etienne Pallier
- Vue détail : object (on peut faire object.pk, …)
486 53 Etienne Pallier
487 53 Etienne Pallier
488 53 Etienne Pallier
489 53 Etienne Pallier
---
490 40 Etienne Pallier
491 87 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}USEFUL TOOLS FOR DEV%
492 87 Etienne Pallier
493 6 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}INSTALLATION FROM THE BEGINNING (for dev only, history of the initial project creation)%
494 6 Etienne Pallier
495 1 Etienne Pallier
496 1 Etienne Pallier
[[pyros_install_from_start|Pyros installation from the beginning]]