Project Development
Version 89 (Etienne Pallier, 04/01/2016 11:42 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 | 88 | Etienne Pallier | --- |
494 | 88 | Etienne Pallier | |
495 | 89 | Etienne Pallier | h3. django-extensions and graphviz : useful for generating an image of all the models and their relationships |
496 | 89 | Etienne Pallier | |
497 | 89 | Etienne Pallier | |
498 | 89 | Etienne Pallier | |
499 | 89 | Etienne Pallier | http://django-extensions.readthedocs.org/en/latest/installation_instructions.html |
500 | 89 | Etienne Pallier | |
501 | 89 | Etienne Pallier | --- |
502 | 89 | Etienne Pallier | |
503 | 89 | Etienne Pallier | |
504 | 89 | Etienne Pallier | |
505 | 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)% |
506 | 6 | Etienne Pallier | |
507 | 1 | Etienne Pallier | |
508 | 1 | Etienne Pallier | [[pyros_install_from_start|Pyros installation from the beginning]] |