Project Development

Version 63 (Etienne Pallier, 03/29/2016 11:35 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 2 Etienne Pallier
{{>toc}}
8 2 Etienne Pallier
9 2 Etienne Pallier
---
10 3 Etienne Pallier
11 3 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}TODO%
12 3 Etienne Pallier
13 36 Etienne Pallier
 * Interface admin (http://localhost:8000/admin):
14 1 Etienne Pallier
15 36 Etienne Pallier
  * Impossible d'ajouter un pays dans Country depuis admin (erreur sur pyrosuser.name)
16 36 Etienne Pallier
  * Impossible d'ajouter un telescope (erreur sur device.name)
17 37 Etienne Pallier
  * champs booleans: représenter en case à cocher (cf requests.is_alert) : is_alert = models.BooleanField()
18 36 Etienne Pallier
  * Fix plurals:
19 32 Etienne Pallier
20 36 Etienne Pallier
   * Country : plural "countries" and not "countrys"
21 36 Etienne Pallier
   * NrtAnalysiss
22 36 Etienne Pallier
   * Historys
23 1 Etienne Pallier
   * ...
24 62 Etienne Pallier
<pre>
25 62 Etienne Pallier
class Meta:
26 62 Etienne Pallier
        db_table = 'book'
27 62 Etienne Pallier
        verbose_name = 'Book'
28 62 Etienne Pallier
        verbose_name_plural = 'Books'
29 62 Etienne Pallier
        ordering = ('-release', )
30 62 Etienne Pallier
</pre>
31 63 Etienne Pallier
D'autres options permettent par exemple de rendre le modèle abstrait, ou de demander à Django de ne pas gérer ce modèle en base de données, etc.
32 63 Etienne Pallier
33 37 Etienne Pallier
34 37 Etienne Pallier
 * Models: bien définir les valeurs par défaut
35 37 Etienne Pallier
36 37 Etienne Pallier
  * ex: request.is_alert = False par défaut
37 28 Etienne Pallier
38 28 Etienne Pallier
 * Preload some data for some tables:
39 30 Etienne Pallier
  
40 30 Etienne Pallier
  * country => France, Mexico, ...
41 30 Etienne Pallier
  * sequencetype => 0=routine, 1=alert, ...
42 28 Etienne Pallier
  * userlevel => 0=normal, 1=expert, 2=admin, ...
43 28 Etienne Pallier
  * ...
44 27 Etienne Pallier
45 27 Etienne Pallier
 * updated et created : champs automatiques Django
46 54 Etienne Pallier
<pre>
47 58 Etienne Pallier
# (ajoute automatiquement la date du jour)
48 54 Etienne Pallier
class Tache(models.Model):
49 54 Etienne Pallier
	date_limite = models.DateField(auto_now_add)
50 54 Etienne Pallier
</pre>
51 54 Etienne Pallier
52 29 Etienne Pallier
53 29 Etienne Pallier
 * readonly admin interface : https://gist.github.com/aaugustin/1388243
54 35 Etienne Pallier
55 35 Etienne Pallier
 * Ecrire quelques premiers petits tests
56 18 Etienne Pallier
57 3 Etienne Pallier
 * Tester install eclipse from scratch (vérifier qu'on n'a plus besoin de faire "set as pydev" et "set as django" et set DJANGO_MANAGE_LOCATION et set DJANGO_SETTINGS_MODULE)
58 3 Etienne Pallier
59 3 Etienne Pallier
 * Séparation des BD Django et Pyros
60 3 Etienne Pallier
61 3 Etienne Pallier
 * Intégration des modules Django déjà développés
62 3 Etienne Pallier
63 3 Etienne Pallier
 * Intégration continue avec Jenkins (+ run des tests sur une VM Windows)
64 3 Etienne Pallier
65 3 Etienne Pallier
 * Planifier la suite...
66 3 Etienne Pallier
67 3 Etienne Pallier
 * Doc pour le meeting de mai
68 24 Etienne Pallier
69 55 Etienne Pallier
 * passer la TODO list sur redmine (=> roadmap)
70 55 Etienne Pallier
71 57 Etienne Pallier
 * passer sur sourcesup :   
72 57 Etienne Pallier
  
73 57 Etienne Pallier
  * Git sur sourcesup (avec jenkins) : https://services.renater.fr/sourcesup/formation/chap04#gestion_d_un_projet_avec_git_jenkins_sonar_et_nexus
74 57 Etienne Pallier
75 56 Etienne Pallier
76 24 Etienne Pallier
 * pyrossu : pyrossu!
77 3 Etienne Pallier
78 4 Etienne Pallier
---
79 4 Etienne Pallier
80 4 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}LIENS UTILES%
81 4 Etienne Pallier
82 4 Etienne Pallier
 * Liens vers web local :
83 4 Etienne Pallier
84 4 Etienne Pallier
  * homepage: http://localhost:8000
85 4 Etienne Pallier
  * admin: http://localhost:8000/admin
86 25 Etienne Pallier
87 25 Etienne Pallier
 * Eclipse:
88 26 Etienne Pallier
 
89 26 Etienne Pallier
  * Shift-Ctrl-f (ou Shift-Cmd-f) : reformatage du fichier selon PEP8
90 25 Etienne Pallier
  * Shift-Ctrl-1 : make doc string ...
91 4 Etienne Pallier
92 4 Etienne Pallier
 * Django:
93 4 Etienne Pallier
94 38 Etienne Pallier
  * Coding style: https://docs.djangoproject.com/en/dev/internals/contributing/writing-code/coding-style
95 38 Etienne Pallier
  * Doc : https://docs.djangoproject.com/en/1.9
96 44 Etienne Pallier
  * (FR) http://docs.djangoproject.com/fr
97 44 Etienne Pallier
  * http://stackoverflow.com/questions/tagged/django
98 44 Etienne Pallier
  * www.django-fr.org/planete
99 44 Etienne Pallier
  * https://www.djangopackages.com/
100 44 Etienne Pallier
  * http://forum.django-fr.org
101 44 Etienne Pallier
  * La mailing list : django@lists.afpy.org
102 44 Etienne Pallier
103 44 Etienne Pallier
104 4 Etienne Pallier
105 4 Etienne Pallier
 * Git docs: 
106 19 Etienne Pallier
107 4 Etienne Pallier
  * Permissions gitlab: https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/permissions/permissions.md
108 4 Etienne Pallier
  * https://git-scm.com/docs
109 4 Etienne Pallier
  * https://git-scm.com/book/fr/v1/Les-bases-de-Git-Travailler-avec-des-d%C3%A9p%C3%B4ts-distants
110 4 Etienne Pallier
  * les workflows: https://aresu.dsi.cnrs.fr/spip.php?article219
111 15 Etienne Pallier
  * Git for Eclipse users : http://wiki.eclipse.org/EGit/Git_For_Eclipse_Users
112 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
113 4 Etienne Pallier
114 4 Etienne Pallier
 * CADOR web interface: http://cador.obs-hp.fr/ros/manual/cador_actions.html
115 4 Etienne Pallier
116 4 Etienne Pallier
 * pylint (analyse de code) : https://www.pylint.org
117 4 Etienne Pallier
118 4 Etienne Pallier
 * pyreverse (uml diagrams generation, inclus dans pylint) : https://www.logilab.org/blogentry/6883
119 4 Etienne Pallier
120 4 Etienne Pallier
 * tox (a generic virtualenv management and test command line tool) : https://testrun.org/tox/latest/index.html
121 4 Etienne Pallier
122 5 Etienne Pallier
---
123 5 Etienne Pallier
124 5 Etienne Pallier
125 5 Etienne Pallier
---
126 5 Etienne Pallier
127 5 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}I - DATABASE SCHEMA (v0.2.1)%
128 5 Etienne Pallier
129 5 Etienne Pallier
130 6 Etienne Pallier
{{thumbnail(PYROS_PDM_v021.png, size=300, title=Pyros data model)}}
131 7 Etienne Pallier
132 6 Etienne Pallier
---
133 7 Etienne Pallier
134 6 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}II - Get the project (from gitlab)%
135 20 Etienne Pallier
136 20 Etienne Pallier
h3. Gitlab management interface
137 20 Etienne Pallier
138 20 Etienne Pallier
https://gitlab.irap.omp.eu/epallier/pyros
139 20 Etienne Pallier
140 20 Etienne Pallier
https://gitlab.irap.omp.eu/epallier/pyros/team
141 20 Etienne Pallier
142 6 Etienne Pallier
h3. Get the project
143 8 Etienne Pallier
144 8 Etienne Pallier
https://projects.irap.omp.eu/projects/pyros/wiki/Project_Installation#II-Get-the-project-from-gitlab
145 7 Etienne Pallier
146 7 Etienne Pallier
---
147 11 Etienne Pallier
148 11 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}III - INSTALLATION%
149 11 Etienne Pallier
150 11 Etienne Pallier
https://projects.irap.omp.eu/projects/pyros/wiki/Project_Installation#III-INSTALLATION
151 11 Etienne Pallier
152 11 Etienne Pallier
---
153 6 Etienne Pallier
154 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)%
155 6 Etienne Pallier
156 6 Etienne Pallier
[[django_backoffice_config|Configuration of the Django Back office (admin)]]
157 9 Etienne Pallier
158 9 Etienne Pallier
---
159 13 Etienne Pallier
160 43 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}V - EVOLUTION OF THE PROJECT%
161 1 Etienne Pallier
162 43 Etienne Pallier
163 43 Etienne Pallier
164 43 Etienne Pallier
h3. Linking the User model to the django's one
165 43 Etienne Pallier
166 43 Etienne Pallier
* Modifications in models.py :
167 43 Etienne Pallier
168 43 Etienne Pallier
    * Rename User model to PyrosUser
169 43 Etienne Pallier
    * Rename user table name to pyros_user
170 43 Etienne Pallier
    * Change all occurences (User -> PyrosUser, users -> pyros_users, ...)
171 43 Etienne Pallier
    * from django.contrib.auth.models import User <== add at the beginning of the file
172 43 Etienne Pallier
    * user = models.OneToOneField(User, on_delete=models.CASCADE) <== add this field in PyrosUser declaration
173 43 Etienne Pallier
    * delete fields in PyrosUser : name, firstname, email, login, pass
174 43 Etienne Pallier
175 43 Etienne Pallier
* Modifications in admin.py :
176 43 Etienne Pallier
177 43 Etienne Pallier
    * Change all occurences (User* -> PyrosUser*, users -> pyros_users, ...)
178 43 Etienne Pallier
179 43 Etienne Pallier
<pre>
180 43 Etienne Pallier
$ python manage.py makemigrations pyrosapp
181 43 Etienne Pallier
$ python manage.py migrate
182 43 Etienne Pallier
</pre>
183 43 Etienne Pallier
184 43 Etienne Pallier
---
185 43 Etienne Pallier
186 43 Etienne Pallier
h3. Manage static files (for admin but also for each application)
187 41 Etienne Pallier
188 41 Etienne Pallier
./manage.py runserver
189 41 Etienne Pallier
190 41 Etienne Pallier
if DEBUG=False, we have errors, missing static files :
191 41 Etienne Pallier
192 41 Etienne Pallier
<pre>
193 41 Etienne Pallier
Not Found: /static/admin/css/base.css
194 41 Etienne Pallier
Not Found: /static/admin/css/login.css
195 41 Etienne Pallier
Not Found: /admin/login
196 41 Etienne Pallier
Not Found: /static/admin/css/base.css
197 41 Etienne Pallier
Not Found: /static/admin/css/login.css
198 41 Etienne Pallier
Not Found: /static/admin/css/base.css
199 41 Etienne Pallier
Not Found: /static/admin/css/login.css
200 41 Etienne Pallier
Not Found: /static/admin/css/base.css
201 41 Etienne Pallier
Not Found: /static/admin/css/dashboard.css
202 41 Etienne Pallier
Not Found: /static/admin/css/base.css
203 41 Etienne Pallier
Not Found: /static/admin/css/base.css
204 41 Etienne Pallier
205 41 Etienne Pallier
</pre>
206 41 Etienne Pallier
207 41 Etienne Pallier
208 41 Etienne Pallier
=> We have to activate the static files management
209 41 Etienne Pallier
210 41 Etienne Pallier
(see https://docs.djangoproject.com/en/1.9/howto/static-files)
211 41 Etienne Pallier
212 41 Etienne Pallier
In pyros/urls.py, add this:
213 41 Etienne Pallier
<pre>
214 41 Etienne Pallier
215 41 Etienne Pallier
from django.conf import settings
216 41 Etienne Pallier
from django.conf.urls.static import static
217 41 Etienne Pallier
218 41 Etienne Pallier
urlpatterns = [
219 41 Etienne Pallier
    url(r'^admin/', admin.site.urls),
220 41 Etienne Pallier
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
221 41 Etienne Pallier
</pre>
222 41 Etienne Pallier
223 41 Etienne Pallier
STATIC_ROOT must be defined in settings and says where is the root of all static files
224 41 Etienne Pallier
225 41 Etienne Pallier
Edit settings.py, add:
226 41 Etienne Pallier
<pre>
227 41 Etienne Pallier
STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), 'public', 'static')
228 41 Etienne Pallier
</pre>
229 41 Etienne Pallier
230 41 Etienne Pallier
231 41 Etienne Pallier
./manage.py collectstatic
232 41 Etienne Pallier
233 41 Etienne Pallier
=> 56 static files copied to '.../PYROS/public/static'
234 41 Etienne Pallier
235 41 Etienne Pallier
(in fact it is in public/static/admin/)
236 41 Etienne Pallier
237 41 Etienne Pallier
Cette commande copie tous les fichiers statiques de toutes les applis
238 41 Etienne Pallier
dans public/static
239 41 Etienne Pallier
240 41 Etienne Pallier
Apache viendra lire ce dossier unique
241 41 Etienne Pallier
242 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 »)
243 41 Etienne Pallier
244 41 Etienne Pallier
245 39 Etienne Pallier
---
246 39 Etienne Pallier
247 45 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}DJANGO SHELL (top cool)%
248 45 Etienne Pallier
249 51 Etienne Pallier
cf page 60 for the ORM methods
250 51 Etienne Pallier
251 45 Etienne Pallier
<pre>
252 45 Etienne Pallier
./manage.py shell
253 45 Etienne Pallier
Python 3.5.1 (default, Mar  2 2016, 03:38:02) 
254 45 Etienne Pallier
(InteractiveConsole)
255 46 Etienne Pallier
256 45 Etienne Pallier
>>> import django
257 46 Etienne Pallier
258 45 Etienne Pallier
>>> from pyrosapp.models import *
259 46 Etienne Pallier
260 45 Etienne Pallier
>>> country = Country(name='mexico', quota=1)
261 45 Etienne Pallier
>>> country.save()
262 50 Etienne Pallier
(ajout si pas d’id, modif si id)
263 50 Etienne Pallier
264 45 Etienne Pallier
>>> country = Country(name='france')
265 45 Etienne Pallier
>>> country.save()
266 45 Etienne Pallier
>>> country.pk
267 45 Etienne Pallier
>>> 2
268 45 Etienne Pallier
269 45 Etienne Pallier
>>> countries = Country.objects.all()
270 45 Etienne Pallier
>>> countries.count
271 45 Etienne Pallier
>>> <bound method QuerySet.count of <Country: mexico>, <Country: france>>
272 45 Etienne Pallier
>>> countries.count()
273 45 Etienne Pallier
>>> 2
274 45 Etienne Pallier
>>> print(countries)
275 45 Etienne Pallier
>>> <Country: mexico>, <Country: france>
276 45 Etienne Pallier
>>> print(countries.query)
277 45 Etienne Pallier
>>> SELECT country.id, country.name, country.desc, country.quota FROM country
278 45 Etienne Pallier
279 45 Etienne Pallier
>>> cs = countries.filter(name__icontains='fran')
280 45 Etienne Pallier
>>> print(cs)
281 45 Etienne Pallier
>>> <Country: france>
282 45 Etienne Pallier
283 45 Etienne Pallier
>>> cs = countries.filter(name__startswith='me')
284 45 Etienne Pallier
>>> print(cs)
285 45 Etienne Pallier
>>> <Country: mexico>
286 45 Etienne Pallier
287 45 Etienne Pallier
</pre>
288 45 Etienne Pallier
289 45 Etienne Pallier
290 45 Etienne Pallier
---
291 45 Etienne Pallier
292 47 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}HOWTO (divers)%
293 47 Etienne Pallier
294 61 Etienne Pallier
h3. Relationships between models (1-1, 1-N, N-M) (p55)
295 48 Etienne Pallier
296 1 Etienne Pallier
297 61 Etienne Pallier
models.ManyToManyField : représente une relation de type N-N
298 61 Etienne Pallier
(peu importe de quel côté on le déclare)
299 1 Etienne Pallier
300 61 Etienne Pallier
models.OneToOneField : attention, le sens est important, on n’accèdera d’une table à l’autre que dans un sens
301 48 Etienne Pallier
302 61 Etienne Pallier
task <=> user
303 61 Etienne Pallier
task.user
304 61 Etienne Pallier
user.task_set
305 47 Etienne Pallier
306 47 Etienne Pallier
h3. Pour relier une appli python pure à un projet django :
307 47 Etienne Pallier
308 47 Etienne Pallier
=> Ajouter le src/ dans le pythonpath
309 47 Etienne Pallier
310 47 Etienne Pallier
311 47 Etienne Pallier
h3. Séparer le code métier :
312 47 Etienne Pallier
313 47 Etienne Pallier
=> installer le code métier comme un module via pip
314 47 Etienne Pallier
Couches :
315 47 Etienne Pallier
* présentation
316 47 Etienne Pallier
* métier
317 47 Etienne Pallier
* modèle
318 47 Etienne Pallier
319 49 Etienne Pallier
h3. ORM
320 49 Etienne Pallier
321 49 Etienne Pallier
(cf page 60)
322 49 Etienne Pallier
323 59 Etienne Pallier
<pre>
324 1 Etienne Pallier
b = Book(…)
325 59 Etienne Pallier
b.save()
326 59 Etienne Pallier
=> ajout si pas d’id, modif si id
327 1 Etienne Pallier
328 49 Etienne Pallier
Book.objects.all()
329 49 Etienne Pallier
330 59 Etienne Pallier
books = Book.objects.filter(
331 49 Etienne Pallier
        release__gte=date(2013, 01, 01)
332 49 Etienne Pallier
      ).exclude(
333 49 Etienne Pallier
        borrowed=True
334 49 Etienne Pallier
      )
335 49 Etienne Pallier
336 49 Etienne Pallier
A! La requete est exécutée le plus tard possible, seulement quand django a vraiment besoin de l’exécuter
337 49 Etienne Pallier
338 49 Etienne Pallier
books = Book.objects.exclude(borrowed=True).order_by('title')
339 49 Etienne Pallier
print (books.author)
340 49 Etienne Pallier
341 49 Etienne Pallier
Book.objects.get(pk=12)
342 49 Etienne Pallier
343 1 Etienne Pallier
author = Author.objects.get(pk=25)
344 49 Etienne Pallier
author.books.filter(borrowed=False)
345 49 Etienne Pallier
346 49 Etienne Pallier
(books est le related name déclaré dans la relation manytomany)
347 59 Etienne Pallier
</pre>
348 47 Etienne Pallier
349 47 Etienne Pallier
---
350 47 Etienne Pallier
351 53 Etienne Pallier
h3. Serveur Web
352 53 Etienne Pallier
353 53 Etienne Pallier
Apache : gère tous les fichiers statiques (images, html…), et délègue les fichiers python au serveur django
354 53 Etienne Pallier
355 53 Etienne Pallier
Moteur web django sera soit du wsgi soit du unicorn
356 53 Etienne Pallier
Par défaut, 1 seul worker, mais on peut en configurer plusieurs,
357 53 Etienne Pallier
l’idéal étant de faire nb coeurs + 1 (le worker maître qui fait le dispatching aux autres)
358 53 Etienne Pallier
359 53 Etienne Pallier
Frontend : Apache ou Ngininx
360 53 Etienne Pallier
Backend : gunicorn (gère facilement des workers) ou uwsgi
361 53 Etienne Pallier
362 53 Etienne Pallier
==> gunicorn library.wsgi
363 53 Etienne Pallier
(à la place de manage runserver ==> A EVITER EN PROD)
364 53 Etienne Pallier
365 53 Etienne Pallier
pip install gunicorn
366 53 Etienne Pallier
367 53 Etienne Pallier
gunicorn library.wsgi
368 53 Etienne Pallier
ou
369 53 Etienne Pallier
gunicorn - - workers 5 library.wsgi
370 53 Etienne Pallier
371 53 Etienne Pallier
(gunicorn == tomcat, serveur d’appli Python)
372 53 Etienne Pallier
373 53 Etienne Pallier
1) URL arrive à Apache, qui dispatche (il gère seul les fichiers statiques, et les fichiers python il les transmet à Django)
374 53 Etienne Pallier
2) le fichier library/urls.py prend le relai pour tout ce qui est django
375 53 Etienne Pallier
376 53 Etienne Pallier
377 53 Etienne Pallier
On peut ajouter un fichier urls.py pour gérer les urls de l’appli
378 53 Etienne Pallier
(on garde le urls.py général du projet pour gérer les grandes urls)
379 1 Etienne Pallier
380 60 Etienne Pallier
381 60 Etienne Pallier
382 60 Etienne Pallier
h3. MTV design pattern
383 60 Etienne Pallier
384 60 Etienne Pallier
385 60 Etienne Pallier
MTV == MVC :
386 60 Etienne Pallier
387 60 Etienne Pallier
Model = Model
388 60 Etienne Pallier
Template = View
389 60 Etienne Pallier
View = Controller
390 60 Etienne Pallier
391 60 Etienne Pallier
392 60 Etienne Pallier
CREATION DE LA VUE (en fait, le controleur) : slide 23
393 60 Etienne Pallier
views.py = CONTROLEUR
394 60 Etienne Pallier
395 60 Etienne Pallier
396 60 Etienne Pallier
Template = LA VUE (slide 24)
397 60 Etienne Pallier
(on peut user Jinja à la place du moteur django par défaut)
398 60 Etienne Pallier
399 60 Etienne Pallier
Dans chq appli, on crée un dossier templates/ et un sous-dossier du nom de l’appli/
400 60 Etienne Pallier
(==> todo/templates/todo/)
401 60 Etienne Pallier
402 60 Etienne Pallier
Même principe pour les fichiers statiques :
403 60 Etienne Pallier
src/static/appli1, appli2, appli3…
404 60 Etienne Pallier
405 60 Etienne Pallier
NOMENCLATURE template :
406 60 Etienne Pallier
nommodèle_action.html
407 60 Etienne Pallier
(ex: book_list.html)
408 60 Etienne Pallier
409 60 Etienne Pallier
*On pourrait tout mettre dans le urls.py du projet, MAIS c’est mieux
410 60 Etienne Pallier
de créer un fichier urls.py PAR APPLI, puis de les inclure dans le fichier urls.py principal*
411 60 Etienne Pallier
412 60 Etienne Pallier
Class-based views ==> classes controleurs
413 60 Etienne Pallier
Les méthodes get() et post() sont déjà définies, et on peut les surcharger…
414 60 Etienne Pallier
415 60 Etienne Pallier
Avec un template (gabarit), on peut générer autre chose que du html,
416 60 Etienne Pallier
on peut par ex générer du texte, du pdf, un email, un xml…
417 60 Etienne Pallier
418 60 Etienne Pallier
419 60 Etienne Pallier
420 60 Etienne Pallier
Vue liste (et détail) :
421 60 Etienne Pallier
https://docs.djangoproject.com/fr/1.8/topics/class-based-views/generic-display/
422 60 Etienne Pallier
1) todo/views.py
423 60 Etienne Pallier
from django.views.generic import ListView
424 60 Etienne Pallier
from books.models import Publisher
425 60 Etienne Pallier
426 60 Etienne Pallier
class PublisherList(ListView):
427 60 Etienne Pallier
    model = Publisher
428 60 Etienne Pallier
429 60 Etienne Pallier
430 60 Etienne Pallier
2) todolist/urls.py
431 60 Etienne Pallier
from django.conf.urls import url
432 60 Etienne Pallier
from books.views import PublisherList
433 60 Etienne Pallier
434 60 Etienne Pallier
urlpatterns = [
435 60 Etienne Pallier
    url(r'^publishers/$', PublisherList.as_view()),
436 60 Etienne Pallier
]
437 60 Etienne Pallier
438 60 Etienne Pallier
3) todo/templates/todo/
439 60 Etienne Pallier
440 60 Etienne Pallier
441 60 Etienne Pallier
442 60 Etienne Pallier
- Vue Liste : par défaut le template reçoit un objet « objects_list »
443 60 Etienne Pallier
- Vue détail : object (on peut faire object.pk, …)
444 53 Etienne Pallier
445 53 Etienne Pallier
446 53 Etienne Pallier
447 53 Etienne Pallier
---
448 53 Etienne Pallier
449 40 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)%
450 6 Etienne Pallier
451 6 Etienne Pallier
452 1 Etienne Pallier
[[pyros_install_from_start|Pyros installation from the beginning]]