Project Development

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