published: {{ post.published_date }}
+{{ post.title }}
+{{ post.text|linebreaksbr }}
+diff --git a/.bookignore b/.bookignore
new file mode 100644
index 00000000000..7e458990f2f
--- /dev/null
+++ b/.bookignore
@@ -0,0 +1,6 @@
+.bookignore
+.github
+.gitignore
+crowdin.yaml
+package-lock.json
+package.json
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
new file mode 100644
index 00000000000..ee061951a8b
--- /dev/null
+++ b/.github/CODEOWNERS
@@ -0,0 +1,24 @@
+# default:
+* @DjangoGirls/committers
+
+# language PR review teams for the respective translations:
+/bg/ @DjangoGirls/bg-pr
+/cs/ @DjangoGirls/cs-pr
+/de/ @DjangoGirls/de-pr
+/el/ @DjangoGirls/el-pr
+/en/ @DjangoGirls/en-pr
+/es/ @DjangoGirls/es-pr
+/fa/ @DjangoGirls/fa-pr
+/fr/ @DjangoGirls/fr-pr
+/hu/ @DjangoGirls/hu-pr
+/hy/ @DjangoGirls/hy-pr
+/it/ @DjangoGirls/it-pr
+/ja/ @DjangoGirls/ja-pr
+/ko/ @DjangoGirls/ko-pr
+/pl/ @DjangoGirls/pl-pr
+/pt/ @DjangoGirls/pt-pr
+/ru/ @DjangoGirls/ru-pr
+/sk/ @DjangoGirls/sk-pr
+/tr/ @DjangoGirls/tr-pr
+/uk/ @DjangoGirls/uk-pr
+/zh/ @DjangoGirls/zh-pr
diff --git a/.github/issue_template.md b/.github/issue_template.md
new file mode 100644
index 00000000000..52373ac3126
--- /dev/null
+++ b/.github/issue_template.md
@@ -0,0 +1,11 @@
+### Issue description
+
+Describe what's the problem here.
+
+### Language
+
+Is this related to a specific language of the tutorial?
+
+### Operating system
+
+What operating system does this issue relate to?
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
new file mode 100644
index 00000000000..741ca75c3e7
--- /dev/null
+++ b/.github/pull_request_template.md
@@ -0,0 +1,5 @@
+Changes in this pull request:
+
+-
+-
+-
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
new file mode 100644
index 00000000000..0f9e33b9a56
--- /dev/null
+++ b/.github/workflows/deploy.yml
@@ -0,0 +1,54 @@
+---
+name: Build and Deploy
+
+on:
+ push:
+ branches:
+ - master
+
+permissions:
+ contents: read
+ pages: write
+ id-token: write
+
+concurrency:
+ group: "pages"
+ cancel-in-progress: true
+
+jobs:
+ build:
+ runs-on: ubuntu-24.04
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ persist-credentials: false
+ - uses: awalsh128/cache-apt-pkgs-action@v1
+ with:
+ packages: calibre
+ - name: Install and Build
+ run: |
+ sudo apt install rename
+ npm install
+ npx honkit build
+ npx honkit epub
+ rename 's/^book/django-girls-tutorial/' book_*.epub
+ mv *.epub _book/
+ - name: Upload artifact
+ uses: actions/upload-pages-artifact@v3
+ with:
+ path: _book
+
+ deploy:
+ needs: build
+ permissions:
+ pages: write
+ id-token: write
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ runs-on: ubuntu-24.04
+ steps:
+ - name: Deploy to GitHub Pages
+ id: deployment
+ uses: actions/deploy-pages@v4
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
new file mode 100644
index 00000000000..f0bd5c4a811
--- /dev/null
+++ b/.github/workflows/test.yml
@@ -0,0 +1,17 @@
+name: Build
+on:
+ - pull_request
+
+jobs:
+ build:
+ runs-on: ubuntu-24.04
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ persist-credentials: false
+
+ - name: Install and Build
+ run: |
+ npm install
+ npx honkit build
diff --git a/.gitignore b/.gitignore
index 53de980d74a..3045a3d9538 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,8 @@ MANIFEST
.DS_Store
_book
node_modules
+package-lock.json
+.idea
+.swp
+.langs
+.vscode/
diff --git a/.nojekyll b/.nojekyll
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/CNAME b/CNAME
new file mode 100644
index 00000000000..e204ba9c9a7
--- /dev/null
+++ b/CNAME
@@ -0,0 +1 @@
+tutorial.djangogirls.org
\ No newline at end of file
diff --git a/LANGS.md b/LANGS.md
index 40edb26daeb..751d6faf913 100644
--- a/LANGS.md
+++ b/LANGS.md
@@ -1,14 +1,20 @@
* [🇺🇸 English](en/)
-* [🇨🇿 Czech (beta)](cs/)
+* [🇧🇬 Български (beta)](bg/)
+* [🇨🇿 Čeština (beta)](cs/)
+* [🇩🇪 Deutsch](de/)
+* [🇬🇷 Ελληνικά (beta)](el/)
* [🇪🇸 Español (beta)](es/)
-* [🇫🇷 Français](fr/)
-* [🇮🇹 Italian (beta)](it/)
+* [🇮🇷 فارسی (beta)](fa/)
+* [🇫🇷 Français (beta)](fr/)
* [🇭🇺 Magyar (beta)](hu/)
+* [🇦🇲 հայերեն (beta)](hy/)
+* [🇮🇹 Italiano (beta)](it/)
+* [🇯🇵 日本語](ja/)
+* [🇰🇵/🇰🇷 한국어 (beta)](ko/)
* [🇵🇱 Polski](pl/)
-* [🇵🇹 Português-brasileiro (beta)](pt/)
-* [🇹🇷 Türkçe (beta)](tr/)
+* [🇧🇷 Português-brasileiro](pt/)
* [🇷🇺 Русский (beta)](ru/)
+* [🇸🇰 Slovenčina (beta)](sk/)
+* [🇹🇷 Türkçe (beta)](tr/)
* [🇺🇦 Українська](uk/)
* [🇨🇳 简体中文](zh/)
-* [🇰🇵/🇰🇷 한국어 (beta)](ko/)
-* [🇸🇰 Slovak (beta)](sk)
diff --git a/Makefile b/Makefile
new file mode 100644
index 00000000000..6a480076486
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,111 @@
+LANG := en
+LANG_FILE := $(shell test -f .langs && echo .langs || echo LANGS.md)
+LANG_DATA := $(shell grep "$(LANG)/" $(LANG_FILE))
+LANG_NAME := $(shell echo "$(LANG_DATA)" | sed 's/.*\[\(.*\)\].*/\1/')
+
+define ebook_support
+ @if which ebook-convert 1> /dev/null; then\
+ npx honkit $(1) ./ ./djangogirls.$(1);\
+ else\
+ echo "Error: ebook-convert is not found";\
+ echo " * Follow the guide at https://honkit.netlify.app/ebook";\
+ echo " - For Debian/Ubuntu, Try: sudo apt install calibre";\
+ echo " - For MacOS, Try: brew install --cask calibre";\
+ echo " - For Windows and any other OS, Download from https://github.com/kovidgoyal/calibre/releases";\
+ false;\
+ fi
+endef
+
+help:
+ @echo
+ @echo "Usage: make command [LANG=връзка
`, ще се прилага стилът `h1 a`. В този случай ние му казваме да промени цвета си на `#C25100`, което е тъмно оранжево. Или можете да поставите свой собствен цвят тук, но се уверете, че той има добър контраст на бял фон!
+
+Във CSS файл определяме стилове за елементи в HTML файла. Първият начин да идентифицираме елементите е с името на елемента. Може да ги запомните като тагове от секцията HTML. Неща като `a`, `h1` и `body` са примери за имена на елементи. Ние също така идентифицираме елементи по атрибут `class` или атрибут `id`. Class и id са имена, които сами давате на елемента. Класовете определят групи от елементи, а идентификаторите сочат конкретни елементи. Например, можете да идентифицирате следния маркер, като използвате името на тага `a`, класа `external_link` или id `link_to_wiki_page`:
+
+```html
+
+```
+
+Можете да прочетете повече за [CSS селектори в w3schools](http://www.w3schools.com/cssref/css_selectors.asp).
+
+Трябва също така да кажем на нашия HTML шаблон, че добавихме някои CSS. Отворете файла `blog/templates/blog/post_list.html` в редактора на кода и добавете този ред в самото начало:
+
+{% filename %}blog/templates/blog/post_list.html{% endfilename %}
+
+```html
+{% load static %}
+```
+
+Тук просто зареждаме статични файлове. :) Между таговете `` и ``, след връзките към CSS файловете на Bootstrap, добавете този ред:
+
+{% filename %}blog/templates/blog/post_list.html{% endfilename %}
+
+```html
+
+```
+
+Браузърът чете файловете в реда, в който са зададени, така че трябва да се уверим, че това е на правилното място. В противен случай кодът в нашия файл може да бъде редактиран от кода във файловете на Bootstrap. Току-що казахме на нашия шаблон къде се намира нашият CSS файл.
+
+Вашият файл сега трябва да изглежда така:
+
+{% filename %}blog/templates/blog/post_list.html{% endfilename %}
+
+```html
+{% load static %}
+
+
+ Django Girls Blog
+
Ако сега се опитате да посетите http://127.0.0.1:8000/, ще видите съобщение от рода на 'web page not available' . Това е така, защото сървърът (помните командата runserver`?) вече не е активен. Погледнете в конзолата на сървъра си и разберете защо.
+
+
+
+Конзолата ви показва грешка, но не се тревожете – това всъщност е много полезно: Казва ви, **че няма атрибут с име 'post_list'**. Това е името на изгледа, който Django се опитва да намери и използва, но ние не сме го създали все още. На този етап, вашият `/admin/` също няма да работи. Не се тревожете – ще стигнем и до там. Ако виждате съобщение с друга греша, опитайте се да презаредите уеб сървъра. За да направите това, в конзолния прозорец, където сте пуснали сървъра, натиснете Ctrl+C за да го спрете (Ctrl + C заедно). На Windows може би трябва да натиснете Ctrl+Break. След това трябва да презаредите уеб сървъра като напишете командата `python manage.py runserver`.
+
+> Ако искате да научите повече за Django URLconfs, вижте в официалната документация: https://docs.djangoproject.com/en/2.2/topics/http/urls/
\ No newline at end of file
diff --git a/bg/django_urls/images/error1.png b/bg/django_urls/images/error1.png
new file mode 100644
index 00000000000..50618fca3fe
Binary files /dev/null and b/bg/django_urls/images/error1.png differ
diff --git a/bg/django_urls/images/url.png b/bg/django_urls/images/url.png
new file mode 100644
index 00000000000..c22441e930e
Binary files /dev/null and b/bg/django_urls/images/url.png differ
diff --git a/bg/django_views/README.md b/bg/django_views/README.md
new file mode 100644
index 00000000000..02efa058ccc
--- /dev/null
+++ b/bg/django_views/README.md
@@ -0,0 +1,44 @@
+# Django views - време за създаване!
+
+Време е да премахнем пречката, която създадохме в последната глава! :)
+
+*view* е мястото, където поставяме "логиката" на приложението ни. Ще изиска информация от моделът, който създадохме по-рано и ще го подаде на шаблона. Ще създадем шаблон в следващата глава. Изгледите са просто Python фукнции, които са малко по-сложни от тези, които написахме в главата **Въведение в Python**.
+
+Изгледите са във файла `views.py`. Ние ще добавим първи си изглед към файла `blog/views.py`.
+
+## blog/views.py
+
+И така, нека отворим файла в редактора си видим какво има в него:
+
+{% filename %}blog/views.py{% endfilename %}
+
+```python
+from django.shortcuts import render
+
+# Create your views here.
+```
+
+Няма почти нищо все още.
+
+Помнете, че редовете, които започват с `#` са коментари – което означава, че тези редове няма да се четат от Python.
+
+Нека създадем *view* както коментара предлага да направим. Добавете следният минимален изглед под него:
+
+{% filename %}blog/views.py{% endfilename %}
+
+```python
+def post_list(request):
+ return render(request, 'blog/post_list.html', {})
+```
+
+Както забелязвате, създаваме фукнция (`def`) наречена `post_list`, която взима за стойност `request` ще върне друга функция `render`, взимайки стойността, шаблона и контекста.
+
+Запазете файла и отидете на http://127.0.0.1:8000/ за да видите какво имаме там.
+
+Друга грешка! Прочетете какво се случва сега:
+
+
+
+Това показва, че сървърът отново работи, но все още не изглежда както трябва, нали? Не се тревожете. Това е само страница с грешка, няма от какво да се страхувате! Също като съобщение с грешка в конзолата, тези са всъщност от голяма полза. Можете да прочетете, че *TemplateDoesNotExist*. Нека отстраним тази грешка и създадем шаблон в следващата глава!
+
+> Научете повече за Django изгледите като прочетете официалната документация: https://docs.djangoproject.com/en/2.2/topics/http/views/
\ No newline at end of file
diff --git a/bg/django_views/images/error.png b/bg/django_views/images/error.png
new file mode 100644
index 00000000000..1530c879cb5
Binary files /dev/null and b/bg/django_views/images/error.png differ
diff --git a/bg/dynamic_data_in_templates/README.md b/bg/dynamic_data_in_templates/README.md
new file mode 100644
index 00000000000..7268cc70b0b
--- /dev/null
+++ b/bg/dynamic_data_in_templates/README.md
@@ -0,0 +1,81 @@
+# Динамични данни в шаблоните
+
+Имаме различни парчета на места: `Post` моделът е дефиниран в `models.py`, имаме `post_list` във `views.py` и добавен шаблон. Но как всъщност ще направим, така че нашите публикации да се показват на HMTL шаблон? Защото това е, което искаме да направим – да вземем някакво съдържание (запазените модели в базата от данни) и да се показват хубаво на нашия шаблон, нали?
+
+Това е точно, което *views* трябва да правят: свързват моделите с шаблоните. В нашия изглед за `post_list` ще трябва да вземем моделите, които искаме да показваме и да ги предадем на шаблоните. В изгледа ние определяме какво (модел) ще се изобразява в шаблона.
+
+Добре, как ще го постигнем?
+
+Трябва да отворим `blog/views.py` в редактора си. До момента `post_list` изгледа е такъв:
+
+{% filename %}blog/views.py{% endfilename %}
+
+```python
+from django.shortcuts import render
+
+def post_list(request):
+ return render(request, 'blog/post_list.html', {})
+```
+
+Помните ли когато говорихме за вмъкване на код написан в различни файлове? Сега е моментът, в който трябва да вмъкнем модела, който създадохме в `models.py`. Ще добавим реда `from .models import Post` така:
+
+{% filename %}blog/views.py{% endfilename %}
+
+```python
+from django.shortcuts import render
+from .models import Post
+```
+
+Точката преди `models` означава настояща директория или настояща апликация. Двата файла `views.py` и `models.py` са в една и съща директория. Това означава, че можем да използваме `.` и името на файла (без разширението `.py`). Тогава въвеждаме името на модела (`Post`).
+
+Но след това какво? За да вземем всъщност публикация от `Post` модела ни трябва нещо наречено `QuerySet`.
+
+## QuerySet
+
+Вече трябва да сте запознати как работят QuerySets. Говорихме за тях в главата [Django ORM (QuerySets)](../django_orm/README.md).
+
+Сега искаме публикуваните ни блог постове сортирани по дата на публикуване, нали? Вече направихме това в главата QuerySets!
+
+{% filename %}blog/views.py{% endfilename %}
+
+```python
+Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
+```
+
+И така, нека да отворим файла `blog/views.py` в редактора и добавим този код към функцията `def post_list(request)` -- но нека не забравяме първо да добавим `from django.utils import timezone`:
+
+{% filename %}blog/views.py{% endfilename %}
+
+```python
+from django.shortcuts import render
+from django.utils import timezone
+from .models import Post
+
+def post_list(request):
+ posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
+ return render(request, 'blog/post_list.html', {})
+```
+
+Последната липсваща част е подаването на QuerySet постове към контекста на шаблона. Не се притеснявайте -- ще обясним как става в по-следваща глава.
+
+Моля забележете, че създадохме променлива за нашия QuerySet: `posts`. Ползвайте това като име на нашия QuerySet. От сега нататък можем да се отнасяме към него с това име.
+
+В `render` функцията имаме един параметър `request` (всичко се получава от потребителят чрез Internet) и друг даващ файла на шаблона (`'blog/post_list.html'`). Последният параметър, `{}`, е място в което може да добавим някакви неща, така че шаблона да ги използва. Трябва да им дадем имена (ще се придържаме към `'posts'` засега). :) Трябва да изглежда ето така: `{'posts': posts}`. Забележете, че частта преди `:` е низ; трябва да го заградите с кавички: `''`.
+
+И така накрая нашия файл `blog/views.py` трябва да изглежда така:
+
+{% filename %}blog/views.py{% endfilename %}
+
+```python
+from django.shortcuts import render
+from django.utils import timezone
+from .models import Post
+
+def post_list(request):
+ posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
+ return render(request, 'blog/post_list.html', {'posts': posts})
+```
+
+Това е! Време е да се върнем към нашия шаблон и да покажем на екрана QuerySet!
+
+Искате да прочетете малко повече за QuerySets в Django? Трябва да погледнете тук: https://docs.djangoproject.com/en/2.2/ref/models/querysets/
\ No newline at end of file
diff --git a/bg/extend_your_application/README.md b/bg/extend_your_application/README.md
new file mode 100644
index 00000000000..923f2555b66
--- /dev/null
+++ b/bg/extend_your_application/README.md
@@ -0,0 +1,215 @@
+{% set warning_icon = '' %}
+
+# Продължете апликацията си
+
+Вече завършихме всички различни стъпки необходими за създаването на нашия уеб сайт: знаем как да напишем модел, URL, изглед и шаблон. Знаем също и как да направим сайта ни хубав.
+
+Време е за практика!
+
+Първото нешо, което ни е необходимо за блога е очевидно страница, която да показва една публикация, нали така?
+
+Вече разполагаме с `Post` модел, така че няма нужда да правим промени в `models.py`.
+
+## Създайте връзка към шаблона със съдържанието на поста.
+
+Ще започнем като добавим връзка във файла `blog/templates/blog/post_list.html`. Отворете го в редактора си, като до момента трябва да изглежда по този начин: {% filename %}blog/templates/blog/post_list.html{% endfilename %}
+
+```html
+{% extends 'blog/base.html' %}
+
+{% block content %}
+ {% for post in posts %}
+
+ {% endfor %}
+{% endblock %}
+```
+
+{% raw %} Искаме да имаме връзка от заглавието на поста в листа с публикациите до страницата със съдържанието на поста. Нека променим ` създадохме URL правило наречено `post_detail`, което се отнася до изглед с име `views.post_detail`. Това означава, че Django ще очаква изглед функция наречена `post_detail` вътре в `blog/views.py`.
+
+Трябва да отворим `blog/views.py` в редактора и да добавим следния код близо до другите редове `from` :
+
+{% filename %}blog/views.py{% endfilename %}
+
+```python
+from django.shortcuts import render, get_object_or_404
+
+```
+
+И накрая на файла ще добавим нашия изглед (*view*):
+
+{% filename %}blog/views.py{% endfilename %}
+
+```python
+def post_detail(request, pk):
+ post = get_object_or_404(Post, pk=pk)
+ return render(request, 'blog/post_detail.html', {'post': post})
+```
+
+Да. Време е да презаредим страницата: http://127.0.0.1:8000/
+
+
+
+Работи! Но сега какво става, когато кликнете върху връзката със заглавието на поста?
+
+
+
+Оо, не! Друга грешка! Но вече знаем как да се справим с това, нали? Трябва да добавим нов шаблон!
+
+## Създайте шаблон за съдържанието на поста
+
+Ще създадем файл в `blog/templates/blog` наречен `post_detail.html`, и ще го отворим в редактора.
+
+Впишете следния код:
+
+{% filename %}blog/templates/blog/post_detail.html{% endfilename %}
+
+```html
+{% extends 'blog/base.html' %}
+
+{% block content %}
+ {{ post.title }}
`, така че да се свързва със съдържанието на страницата:{% endraw %}
+
+{% filename %}{{ warning_icon }} blog/templates/blog/post_list.html{% endfilename %}
+
+```html
+{{ post.title }}
+```
+
+{% raw %} Време е да обясним мистериозния код `{% url 'post_detail' pk=post.pk %}`. Може би забелязахте, че означението `{% %}` означава, че използваме Django шаблонни етикети. Този път ще изполваме такъв, който създава URL за нас! {% endraw %}
+
+`post_detail` частта означава, че Django трябва да очаква URL в `blog/urls.py` с име name=post_detail
+
+А какво за `pk=post.pk`? `pk` идва накратко от primary key, което е уникален идентификатор за всеки един запис в базата данни. Всеки Django модел има поле, което служи за негов първоначален код (primary key), и каквото и друго име да има, то може също да се съотнесе като "pk". Тъй като не уточнихме първоначалната стойност в нашия `Post` модел, Django създава един за нас (по подразбиране, полето "id" , съдържащо номер, който се увеличава при всеки запис, т.е. 1, 2, 3) и го добавя към полето на всеки от нашите постове. Можем да достигнем primary key като напишем `post.pk`, по същия начин достъпваме други полета (`title`, `author`, и т.н.) в нашия `Post` обект!
+
+Сега като отидем на http://127.0.0.1:8000/ ще видим грешка ( както се очаквкаше, тъй като все още нямаме URL или *view* за `post_detail`). Ще изглежда така:
+
+
+
+## Създаване на URL към съдържанието на поста
+
+Нека създадем URL в `urls.py` за нашия `post_detail` *view*!
+
+Искаме първия ни пост да бъде показван на този **URL**: http://127.0.0.1:8000/post/1/
+
+Сега да направим URL във файла `blog/urls.py`, който да насочва Django към *view* наречен `post_detail`, който ще показва целия блог пост. Отворете файла `blog/urls.py` в редактора си и добавете следния ред `path('post/
{{ post.text|linebreaksbr }}
+Hi there!
+It works!
+ + +``` + +Така, как изглежда уебсайта ви в момента? Отидете на: http://127.0.0.1:8000/ за да разберете + + + +Работи! Добра работа :) + +* Най-простия етикет `` е винаги в началото на една страница и `` е винаги в края и. Както може да видите, цялото съдържание на страницата е между отварящият `` и затварящият етикет `` +* `` е етикет за абзацни елементи; `
` затваря всеки един абзац + +## Глава и тяло на страницата (head и body) + +Всяка HTML страница е разделена на два елемена: **head** и **body**. + +* **head** е елемент, който съдържа информация относно документа, който е показан на екрана. + +* **body** е елемент, който съдържа всичко, което е показано като част от уеб страницата. + +Използваме `` за да кажем на търсачката за конфигурацията на страницата и `` какво точно е на страницата. + +Например, може да сложите заглавие на елемента вътре в `` ето така: + +{% filename %}blog/templates/blog/post_list.html{% endfilename %} + +```html + + +Hi there!
+It works!
+ + +``` + +Запазете файла и презаредете страницата. + + + +Забелязахте ли как търсачката ви разбра, че заглавието на блога е "Ola's blog"? Тълкува `Абзац
` +* `текст` набляга на текста +* `текст` удебелява текста +* `published: 14.06.2014, 12:14
+Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.
+published: 14.06.2014, 12:14
+Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut f.
+{{ post.text|linebreaksbr }}
{% endfor %} -{% endblock content %} +{% endblock %} ``` diff --git a/cs/extend_your_application/images/404_2.png b/cs/extend_your_application/images/404_2.png index a8cb53172af..0a6fdf3234e 100644 Binary files a/cs/extend_your_application/images/404_2.png and b/cs/extend_your_application/images/404_2.png differ diff --git a/cs/extend_your_application/images/attribute_error2.png b/cs/extend_your_application/images/attribute_error2.png index 6edcd9933c3..33a3b36b1d3 100644 Binary files a/cs/extend_your_application/images/attribute_error2.png and b/cs/extend_your_application/images/attribute_error2.png differ diff --git a/cs/extend_your_application/images/does_not_exist2.png b/cs/extend_your_application/images/does_not_exist2.png index 023d8720081..e7015f2c80d 100644 Binary files a/cs/extend_your_application/images/does_not_exist2.png and b/cs/extend_your_application/images/does_not_exist2.png differ diff --git a/cs/extend_your_application/images/no_reverse_match2.png b/cs/extend_your_application/images/no_reverse_match2.png index 306926206f8..aba1c9c8980 100644 Binary files a/cs/extend_your_application/images/no_reverse_match2.png and b/cs/extend_your_application/images/no_reverse_match2.png differ diff --git a/cs/extend_your_application/images/post_detail2.png b/cs/extend_your_application/images/post_detail2.png index 240dc447b51..b40c92efb8c 100644 Binary files a/cs/extend_your_application/images/post_detail2.png and b/cs/extend_your_application/images/post_detail2.png differ diff --git a/cs/extend_your_application/images/post_list2.png b/cs/extend_your_application/images/post_list2.png index 8ae30c71311..dd0a0d67a6f 100644 Binary files a/cs/extend_your_application/images/post_list2.png and b/cs/extend_your_application/images/post_list2.png differ diff --git a/cs/extend_your_application/images/template_does_not_exist2.png b/cs/extend_your_application/images/template_does_not_exist2.png index 335ce2569ef..c856abeda31 100644 Binary files a/cs/extend_your_application/images/template_does_not_exist2.png and b/cs/extend_your_application/images/template_does_not_exist2.png differ diff --git a/cs/how_the_internet_works/images/internet_1.png b/cs/how_the_internet_works/images/internet_1.png index 9c5bcf0b003..e289eac2b23 100644 Binary files a/cs/how_the_internet_works/images/internet_1.png and b/cs/how_the_internet_works/images/internet_1.png differ diff --git a/cs/how_the_internet_works/images/internet_2.png b/cs/how_the_internet_works/images/internet_2.png index dd5861f376f..e8cf8b77999 100644 Binary files a/cs/how_the_internet_works/images/internet_2.png and b/cs/how_the_internet_works/images/internet_2.png differ diff --git a/cs/how_the_internet_works/images/internet_3.png b/cs/how_the_internet_works/images/internet_3.png index a23488e3f2f..6f5d95dec80 100644 Binary files a/cs/how_the_internet_works/images/internet_3.png and b/cs/how_the_internet_works/images/internet_3.png differ diff --git a/cs/how_the_internet_works/images/internet_4.png b/cs/how_the_internet_works/images/internet_4.png index 2661cec1b61..d4748ac48ef 100644 Binary files a/cs/how_the_internet_works/images/internet_4.png and b/cs/how_the_internet_works/images/internet_4.png differ diff --git a/cs/html/README.md b/cs/html/README.md index 503feb1e10e..929acd7ff9b 100755 --- a/cs/html/README.md +++ b/cs/html/README.md @@ -156,7 +156,7 @@ Co ve skutečnosti chceme, je zobrazit opravdové příspěvky přidané v naše Bylo by fajn vidět všecho tohle venku a živě na internetu, že ano? Pojďme udělat další PythonAnywhere nasazení (deploy): -### Commitni a hoď svůj kód na Github +### Commitni a hoď svůj kód na GitHub Nejdříve se podívejme, které soubory se změnily od posledního nasazení (deploy). Zadej tyto příkazy lokálně (ne na PythonAnywhere): @@ -186,7 +186,7 @@ $ git commit -m "Změněn HTML kód stránek." > **Poznámka** Ujisti se, že používáš dvojité uvozovky kolem zprávy. -Jakmile jsme s tímto hotovy, nahrajeme (push) naše změny na Github: +Jakmile jsme s tímto hotovy, nahrajeme (push) naše změny na GitHub: ``` git push diff --git a/cs/html/images/step1.png b/cs/html/images/step1.png index e9c2f1082d6..eb474aaeddd 100644 Binary files a/cs/html/images/step1.png and b/cs/html/images/step1.png differ diff --git a/cs/html/images/step3.png b/cs/html/images/step3.png index 811226fa3fc..47ede3f9993 100644 Binary files a/cs/html/images/step3.png and b/cs/html/images/step3.png differ diff --git a/cs/html/images/step4.png b/cs/html/images/step4.png index bd6c1a044e0..0e6b48ec4a5 100644 Binary files a/cs/html/images/step4.png and b/cs/html/images/step4.png differ diff --git a/cs/html/images/step6.png b/cs/html/images/step6.png index e42a2fe5388..f044389de53 100644 Binary files a/cs/html/images/step6.png and b/cs/html/images/step6.png differ diff --git a/cs/images/application.png b/cs/images/application.png index 6dcba6202c7..79071fe8d1b 100644 Binary files a/cs/images/application.png and b/cs/images/application.png differ diff --git a/cs/installation/README.md b/cs/installation/README.md index bb9faf25871..cdd38b9c502 100755 --- a/cs/installation/README.md +++ b/cs/installation/README.md @@ -1,6 +1,6 @@ # Pokud děláš tutoriál doma -Pokud děláš tento tutorial doma, ne na jedné z [Django girls akcí](https://djangogirls.org/events/), můžeš zcela vynechat tuto kapitolu a jít rovnou na kapitolu [jak funguje Internet?](../how_the_internet_works/README.md). +Pokud děláš tento tutorial doma, ne na jedné z [Django girls akcí](https://djangogirls.org/events/), můžeš zcela vynechat tuto kapitolu a jít rovnou na kapitolu [jak funguje Internet](../how_the_internet_works/README.md). To proto, že zde uvedené věci stejně vysvětlíme v průběhu celého kurzu a tato stránka pouze shromažďuje všechny pokyny pro instalaci na jednom místě. Jedna z Django Girls událostí "Instalační večer" se zaobírá instalováním všeho, co budeme potřebovat, což nás už nebude zdržovat během samotného worshopu. To je pro nás užitečná úspora času. @@ -44,6 +44,6 @@ Gratulujeme, právě sis zřídila všechny účty a nastavila vše, co potřebu * [Úvod do příkazového řádku](../intro_to_command_line/README.md) - * [Úvod do Pythonu](../intro_to_command_line/README.md) + * [Úvod do Pythonu](../python_introduction/README.md) * [Co je Django?](../django/README.md) diff --git a/cs/intro_to_command_line/README.md b/cs/intro_to_command_line/README.md index 2bdd6c0f5de..e736738bc1b 100755 --- a/cs/intro_to_command_line/README.md +++ b/cs/intro_to_command_line/README.md @@ -20,7 +20,7 @@ Chceš-li začít experimentovat, je třeba nejprve otevřít naše rozhraní p Jdi na menu Start → Všechny programy → Příslušenství → Příkazová řádka. -### Mac OS X +### macOS Aplikace → Nástroje → Terminál. diff --git a/cs/python_installation/images/add_python_to_windows_path.png b/cs/python_installation/images/add_python_to_windows_path.png index 9510d6f2176..3266efb6177 100644 Binary files a/cs/python_installation/images/add_python_to_windows_path.png and b/cs/python_installation/images/add_python_to_windows_path.png differ diff --git a/cs/python_installation/instructions.md b/cs/python_installation/instructions.md index 207e1f1c0a4..316d6845eab 100755 --- a/cs/python_installation/instructions.md +++ b/cs/python_installation/instructions.md @@ -26,18 +26,10 @@ Pokud Python nemáš nainstalovaný nebo pokud chceš nainstalovat jinou verzi, Použij tento příkaz v konzoli: ``` -sudo apt-get install python3.4 +sudo apt install python3.4 ``` -#### Fedora (do verze 21) - -Použij tento příkaz v konzoli: - -``` -sudo yum install python3.4 -``` - -#### Fedora (22 +) +#### Fedora Použij tento příkaz v konzoli: @@ -53,11 +45,11 @@ Použij tento příkaz v konzoli: $ sudo zypper install python3 ``` -### OS X +### macOS Musíš jít na web https://www.python.org/downloads/release/python-342/ a stáhnout si instalátor Python: - * Stáhni *Mac OS X 64-bit/32-bit installer* soubor, + * Stáhni *macOS 64-bit/32-bit installer* soubor, * Poklepej na *python-3.4.3-macosx10.6.pkg*, chceš-li spustit instalační program. Ověř, zda instalace proběhla úspěšně, otevři aplikaci *Terminal* a spusť příkaz `python3`: diff --git a/cs/python_introduction/README.md b/cs/python_introduction/README.md index 3448c09a381..6a197344f9d 100755 --- a/cs/python_introduction/README.md +++ b/cs/python_introduction/README.md @@ -444,7 +444,7 @@ Už jsi někdy slyšela výraz "srovnávat jablka a hrušky"? Zkusme v Pythonu e >>> 1 > 'django' Traceback (most recent call last): File "{{ post.text|linebreaksbr }}
{% endfor %} -{% endblock content %} +{% endblock %} ``` To je ono! Zkontroluj, zda tvoje stránky stále správně fungují :) diff --git a/cs/whats_next/README.md b/cs/whats_next/README.md index f00eee800f1..5c52f3bfb88 100755 --- a/cs/whats_next/README.md +++ b/cs/whats_next/README.md @@ -17,7 +17,7 @@ Poté nezapomeň: Ano! Zaprvé, jdi a zkus naši další knihu, jmenuje se [Django Girls Tutorial: Extensions][3]. - [3]: http://djangogirls.gitbooks.io/django-girls-tutorial-extensions/ + [3]: https://tutorial-extensions.djangogirls.org Později můžeš zkusit, některý ze zdrojů uvedených níže. Všechny můžeme velmi doporučit! @@ -36,5 +36,5 @@ Později můžeš zkusit, některý ze zdrojů uvedených níže. Všechny můž [7]: https://www.codecademy.com/tracks/web [8]: https://github.com/ggcarrots/django-carrots/ [9]: http://learnpythonthehardway.org/book/ - [10]: http://gettingstartedwithdjango.com/ + [10]: http://www.gettingstartedwithdjango.com/ [11]: https://twoscoopspress.com/products/two-scoops-of-django-1-8 diff --git a/de/GLOSSARY.md b/de/GLOSSARY.md new file mode 100644 index 00000000000..26a8c07100e --- /dev/null +++ b/de/GLOSSARY.md @@ -0,0 +1,3 @@ +# Code-Editor + +Ein Code-Editor ist eine Anwendung, die es dir erlaubt, deinen Code zu speichern, um später daran weiterzuarbeiten. Du kannst in dem [Code-Editor Kapitel](./code_editor/README.md) erfahren, woher du einen bekommst. \ No newline at end of file diff --git a/de/README.md b/de/README.md new file mode 100644 index 00000000000..db87ba0c460 --- /dev/null +++ b/de/README.md @@ -0,0 +1,51 @@ +# Django Girls Tutorial + +[](https://gitter.im/DjangoGirls/tutorial) + +> Dieses Werk ist unter der Creative Commons Attribution-ShareAlike 4.0 International License lizensiert. Eine Kopie dieser Lizenz finden Sie auf http://creativecommons.org/licenses/by-sa/4.0/ + +## Willkommen + +Willkommen beim Django Girls Tutorial! Wir freuen uns, dass du hier bist. :) In diesem Tutorial schauen wir gemeinsam unter die Haube der Technologien im Internet, geben dir einen Einblick in die Bits und Bytes, die zusammen das Internet bilden, wie wir es heute kennen. + +Wie alles Unbekannte wird das ein Abenteuer sein – aber keine Sorge: Da du bereits den Mut aufgebracht hast, hier zu sein, wirst du das schon meistern. :) + +## Einleitung + +Hattest du auch schon einmal das Gefühl, dass Technik in der Welt immer wichtiger wird und du da nicht ganz mithalten kannst? Wolltest du schon immer einmal eine Website bauen, aber hattest dann nicht genug Motivation, damit anzufangen? Hast du dir irgendwann schon einmal gedacht, dass die Computerwelt zu kompliziert für dich ist, so dass du noch nicht einmal den Versuch unternommen hast, dort selbst etwas zu tun? + +Dann haben wir hier gute Neuigkeiten für dich! Programmieren ist nicht so schwer, wie du denkst, und wir zeigen dir hier, wie viel Spaß es machen kann. + +Dieses Tutorial wird dich nicht auf zauberhafte Weise in eine Programmiererin verwandeln. Wenn du gut darin sein willst, brauchst du Monate oder sogar Jahre des Lernens und Übens. Aber wir wollen dir zeigen, dass Programmieren oder Webseitenerstellen nicht so kompliziert ist, wie es scheint. Wir versuchen, dir auf einfache Art verschiedene, kleine Teile zu zeigen, so dass du davon nicht eingeschüchtert wirst. + +Wir hoffen, dass du danach diese Technik und Technologien so sehr mögen wirst wie wir! + +## Was lernst du in diesem Tutorial? + +Wenn du mit dem Tutorial fertig bist, hast du eine einfache, aber funktionierende Webanwendung: deinen eigenen Blog. Wir zeigen dir, wie man ihn online stellt, andere können dein Werk also sehen! + +Es wird (in etwa) so aussehen: + + + +> Wenn du allein mit diesem Tutorial arbeitest und keinen Coach in der Nähe hast, kannst du in diesem Chat nachfragen, wenn du ein Problem hast: [](https://gitter.im/DjangoGirls/tutorial). Wir haben unsere Coaches und frühere Teilnehmer unserer Workshops gebeten, hin und wieder dort vorbei zu schauen und anderen mit dem Tutorial zu helfen! Hab keine Angst, dort deine Fragen zu stellen! + +Okay, [lass uns ganz am Anfang starten...](./how_the_internet_works/README.md) + +## Das Tutorial daheim durcharbeiten + +An einem Django-Girls-Workshop teilzunehmen ist toll, aber uns ist klar, dass das nicht immer allen möglich ist. Darum wollen wir dich ermutigen, das Tutorial auch zu Hause zu erarbeiten. Für Leser zu Hause erstellen wir gerade Video-Tutorials, die es erleichtern sollen, diesem Tutorial zu folgen. Diese Arbeit ist noch nicht abgeschlossen, aber mehr und mehr Themen werden als Video erfasst und können im [Coding is for girls](https://www.youtube.com/channel/UC0hNd2uW8jTR5K3KBzRuG2A/feed)-YouTube-Kanal angesehen werden. + +In jedem Kapitel, das bereits mit Video unterstützt wird, gibt es einen Link auf das jeweilige Video dazu. + +## Über uns und wie du mithelfen kannst + +Dieses Tutorial wird von [DjangoGirls](https://djangogirls.org/) betreut. Solltest du Fehler finden oder das Tutorial aktualisieren wollen, dann folge den [Richtlinien zum Mitarbeiten](https://github.com/DjangoGirls/tutorial/blob/master/README.md). + +## Möchtest du uns helfen, das Tutorial in andere Sprachen zu übersetzen? + +Zur Zeit haben wir die Übersetzungen auf der crowdin.com Plattform: + +https://crowdin.com/project/django-girls-tutorial + +Sollte deine Sprache nicht aufgeführt sein, dann öffne ein neues [Issue](https://github.com/DjangoGirls/tutorial/issues/new), mit der betreffenden Sprache, dann können wir sie hinzufügen. \ No newline at end of file diff --git a/de/SUMMARY.md b/de/SUMMARY.md new file mode 100644 index 00000000000..28b069b3a29 --- /dev/null +++ b/de/SUMMARY.md @@ -0,0 +1,35 @@ +# Zusammenfassung + +* [Einleitung](README.md) +* [Installation](installation/README.md) + * [Kommandozeile](installation/README.md#command-line) + * [Python](installation/README.md#python) + * [Code-Editor](installation/README.md#code-editor) + * [Virtuelle Umgebung](installation/README.md#virtualenv) + * [Django](installation/README.md#django) + * [Git](installation/README.md#git) + * [GitHub](installation/README.md#github-account) + * [PythonAnywhere](installation/README.md#pythonanywhere-account) +* [Installation (Chromebook)](chromebook_setup/README.md) +* [Wie das Internet funktioniert](how_the_internet_works/README.md) +* [Einführung in die Kommandozeile](intro_to_command_line/README.md) +* [Python-Installation](python_installation/README.md) +* [Der Code-Editor](code_editor/README.md) +* [Einführung in Python](python_introduction/README.md) +* [Django - Was ist das?](django/README.md) +* [Django-Installation](django_installation/README.md) +* [Dein erstes Django-Projekt!](django_start_project/README.md) +* [Django-Models](django_models/README.md) +* [Django-Administration](django_admin/README.md) +* [Veröffentlichen!](deploy/README.md) +* [Django-URLs](django_urls/README.md) +* [Django-Views - leg los!](django_views/README.md) +* [Einführung in HTML](html/README.md) +* [Django-ORM und QuerySets](django_orm/README.md) +* [Dynamische Daten in Templates](dynamic_data_in_templates/README.md) +* [Django-Templates](django_templates/README.md) +* [CSS - mach es hübsch!](css/README.md) +* [Erweiterung der Templates](template_extending/README.md) +* [Erweitere deine Anwendung](extend_your_application/README.md) +* [Django-Formulare](django_forms/README.md) +* [Wie geht es weiter?](whats_next/README.md) \ No newline at end of file diff --git a/de/chromebook_setup/README.md b/de/chromebook_setup/README.md new file mode 100644 index 00000000000..4e1c50d4085 --- /dev/null +++ b/de/chromebook_setup/README.md @@ -0,0 +1,5 @@ +# Chromebook-Installation + +> **Hinweis** Wenn du die [Installation bereits gemacht](../installation/README.md) hast, kannst du direkt zur [Einführung in Python](../python_introduction/README.md) gehen. + +{% include "/chromebook_setup/instructions.md" %} \ No newline at end of file diff --git a/de/chromebook_setup/instructions.md b/de/chromebook_setup/instructions.md new file mode 100644 index 00000000000..990e3144929 --- /dev/null +++ b/de/chromebook_setup/instructions.md @@ -0,0 +1,158 @@ +Du kannst [diesen Abschnitt einfach](http://tutorial.djangogirls.org/en/installation/#install-python) überspringen, falls du kein Chromebook benutzt. Wenn du eins benutzt, wird deine Installation ein wenig anders sein. Du kannst den Rest der Installationsanweisungen ignorieren. + +### Cloud-IDE (PaizaCloud Cloud IDE, AWS Cloud9, Glitch.com) + +Eine Cloud-IDE ist ein Werkzeug, dass dir einen Code-Editor und Zugang zu einem Rechner im Internet bereitstellt, auf dem du die Software installieren, anpassen und ausführen kannst. Für die Dauer des Tutorials wird Cloud IDE zu deinem *lokalen Rechner*. Auch du wirst Befehle in einer Kommandozeilen-Oberfläche ausführen können, genau wie die anderen Teilnehmerinnen, die mit macOS, Ubuntu oder Windows arbeiten. Dein Terminal wird jedoch mit einem Rechner verbunden sein, den Cloud IDE dir bereitstellt. Hier sind die Anleitungen für die Cloud-IDEs (PaizaCloud Cloud IDE, AWS Cloud9, Glitch.com). Wähle eine der Cloud-IDEs aus und folge den Anweisungen der gewählten Cloud IDE. + +#### PaizaCloud Cloud IDE + +1. Gehe zu [PaizaCloud Cloud IDE](https://paiza.cloud/) +2. Lege dir dort ein Benutzerkonto an +3. Klicke auf *New Server* und wähle die Django-App +4. Klicke auf die Schaltfläche "Terminal" (links im Browserfenster) + +Jetzt solltest du links eine Schnittstelle mit einer Seitenleiste und Schaltflächen sehen. Klicke auf den "Terminal"-Button und öffne das Terminal-Fenster mit einer Eingabeaufforderung wie folgt: + +{% filename %}browser{% endfilename %} + + $ + + +Das Terminal auf der PaizaCloud Cloud IDE steht für deine Anweisungen bereit. Du kannst die Größe des Fensters frei einstellen. + +#### AWS Cloud9 + +Zur Zeit verlangt Cloud 9, dass du dich mit AWS anmeldest und Kreditkarten-Informationen angibst. + +1. Installiere Cloud 9 aus dem [Chrome web store](https://chrome.google.com/webstore/detail/cloud9/nbdmccoknlfggadpfkmcpnamfnbkmkcp) +2. Gehe zu [c9.io](https://c9.io) und klicke auf *Get started with AWS Cloud9* +3. Erstelle ein AWS-Benutzerkonto (benötigt Angabe der Kreditkarte, kann aber kostenlos verwendet werden) +4. Gib im AWS-Dashboard *Cloud9* in die Suchzeile ein und klicke es an +5. Klicke im Cloud-9-Dashboard *Create environment* an +6. Gib ihm den Namen *django-girls* +7. Wähle beim Konfigurieren der Einstellungen *Create a new instance for environment (EC2)* als "Environment Type" und den "Instance type" *t2.micro* ("Free-tier eligible." sollte angezeigt werden). Die Voreinstellung bzgl. "cost-saving" ist in Ordnung und auch die anderen Voreinstellungen kannst du belassen. +8. Klicke auf *Next step* +9. Klicke auf *Create environment* + +Jetzt solltest du eine Benutzeroberfläche mit Seitenleiste, ein grosses Fenster mit Text und am unteren Rand ein Feld sehen, das wie folgt aussieht: + +{% filename %}bash{% endfilename %} + + deinbenutzername:~/workspace $ + + +Dieser untere Bereich ist dein Terminal. Dort kannst du Kommandos für den Computer eingeben, den dir Cloud 9 zur Verfügung stellt. Du kannst dieses Fenster vergrößern oder verkleinern. + +#### Glitch.com Cloud-IDE + +1. Gehe auf [Glitch.com](https://glitch.com/) +2. Melde dich für einen Account an (https://glitch.com/signup) oder nutze deinen GitHub-Account, falls du einen hast. (Siehe GitHub-Anweisungen unten.) +3. Klicke auf *Neues Projekt* und wähle *hello-webpage* +4. Klicke auf die Dropdown-Liste Tools (unten links im Fenster) und dann auf den Knopf Terminal, um einen Kommandozeilen-Tab mit einem Prompt wie dem folgenden zu öffnen: + +{% filename %}Terminal{% endfilename %} + + app@name-deines-glitch-projects:~ + + +Wenn du Glitch.com als Cloud-IDE verwendest, musst du keine virtuelle Umgebung erstellen. Erstelle stattdessen die folgenden Dateien manuell: + +{% filename %}glitch.json{% endfilename %} + +```json +{ + "install": "pip3 install -r requirements.txt --user", + "start": "bash start.sh", + "watch": { + "throttle": 1000 + } +} +``` + +{% filename %}requirements.txt{% endfilename %} + + Django~={{ book.django_version }} + + +{% filename %}.bash_profile{% endfilename %} + +```bash +alias python=python3 +alias pip=pip3 +``` + +{% filename %}start.sh{% endfilename %} + +```bash +chmod 600 .bash_profile +pip3 install -r requirements.txt --user +python3 manage.py makemigrations +python3 manage.py migrate +python3 manage.py runserver $PORT +``` + +Gehe nach dem Erstellen der Dateien zum Terminal und führe die folgenden Befehle aus, um dein erstes Django-Projekt zu erstellen: + +{% filename %}Terminal{% endfilename %} + + django-admin.py startproject mysite . + refresh + + +Um detaillierte Fehlermeldungen zu sehen, kannst du Django Debug-Logs für deine Glitch-Anwendung aktivieren. Füge einfach folgendes am Ende der Datei `mysite/settings.py` hinzu. + +{% filename %}mysite/settings.py{% endfilename %} + +```python +LOGGING = { + 'version': 1, + 'disable_existing_loggers': False, + 'handlers': { + 'file': { + 'level': 'DEBUG', + 'class': 'logging.FileHandler', + 'filename': 'debug.log', + }, + }, + 'loggers': { + 'django': { + 'handlers': ['file'], + 'level': 'DEBUG', + 'propagate': True, + }, + }, +} +``` + +Dadurch wird eine Datei namens `debug.log` erzeugt, die aufgetretene Django-Operationen und Fehlermeldungen detailliert aufgeführen wird, was die Fehlersuche und -behebung sehr erleichtern kann, wenn deine Website nicht funktioniert. + +Der erste Neustart des Glitch-Projekts sollte fehlschlagen. (Wenn du auf die oberste Dropdown-Schaltfläche `Show` klickst und dann auf `In a New Window`, erhältst du die Fehlermeldung `DisallowedHost`.) Mach dir jetzt keine Sorgen darüber. Das Tutorial wird dies beheben, sobald du die Django-Einstellungen deines Projekts in der Datei `mysite/settings.py` aktualisierst + +### Virtuelle Umgebung + +Eine virtuelle Umgebung (auch virtualenv genannt) ist wie ein privater Behälter, in den wir nützlichen Code für ein Projekt packen können, an dem wir arbeiten. Wir benutzen sie, um Code für verschiedene Projekte getrennt aufzubewahren, damit dieser nicht vermischt wird. + +Führe Folgendes aus: + +{% filename %}Cloud 9{% endfilename %} + + mkdir djangogirls + cd djangogirls + python3 -m venv myvenv + source myvenv/bin/activate + pip install django~={{ book.django_version }} + + +(Beachte, dass wir im letzten Befehl eine Tilde gefolgt von einem Gleichheitssymbol benutzen: `~=`). + +### GitHub + +Erstelle einen [GitHub](https://github.com)-Account. + +### PythonAnywhere + +Das Django Girls-Tutorial enthält ein Kapitel zum Thema Deployment. Beim Deployment nimmst du den Code, der deiner Web-Anwendung zu Grunde liegt, und packst ihn auf einen öffentlich zugänglichen Computer (Server), damit auch andere Leute deine Arbeit sehen können. + +Es mag seltsam scheinen, das auf einem Chromebook zu tun. Denn wir sind mit Cloud 9 ja bereits auf einem anderen Computer im Internet (anstatt z.B. auf einem lokalen Laptop). Es ist aber trotzdem sinnvoll, denn wir können uns unseren Cloud-9-Arbeitsplatz als Ort für "Dinge in Arbeit" vorstellen und PythonAnywhere als Ort, wo wir unser "fertiges" Projekt der Öffentlichkeit zeigen. + +Melde dich deshalb auf [www.pythonanywhere.com](https://www.pythonanywhere.com) für ein PythonAnywhere-Benutzerkonto an. \ No newline at end of file diff --git a/de/code_editor/README.md b/de/code_editor/README.md new file mode 100644 index 00000000000..9ff0e2c9c79 --- /dev/null +++ b/de/code_editor/README.md @@ -0,0 +1,11 @@ +# Der Code-Editor + +> Für die Leser zu Hause: Dieses Kapitel wird im Video [Installing Python & Code Editor](https://www.youtube.com/watch?v=pVTaqzKZCdA&t=4m43s) behandelt. + +Gleich geht's los! Du wirst deine erste Zeile Programmcode schreiben! Daher ist es jetzt an der Zeit, einen entsprechenden Editor herunterzuladen! + +> **Hinweis** Wenn du ein Chromebook benutzt, dann überspringe dieses Kapitel und folge den [Chromebook Installations](../chromebook_setup/README.md)-Anweisungen. Deine Cloud-IDE (PaizaCloud Cloud IDE oder AWS Cloud9) enthält einen Code-Editor und wenn du eine Datei in deiner Entwicklungsumgebung öffnest, wirst du automatisch den Editor benutzen. +> +> **Hinweis:** Es kann sein, dass du diesen Schritt bereits im [Kapitel "Installation"](../installation/README.md) erledigt hast. In diesem Fall kannst du direkt zum nächsten Kapitel übergehen! + +{% include "/code_editor/instructions.md" %} \ No newline at end of file diff --git a/de/code_editor/instructions.md b/de/code_editor/instructions.md new file mode 100644 index 00000000000..82af5539f5b --- /dev/null +++ b/de/code_editor/instructions.md @@ -0,0 +1,37 @@ +Es gibt viele verschiedene Editoren. Welcher für dich am besten ist, ist weitestgehend Geschmackssache. Die meisten Python-Programmiererinnen verwenden komplexe, aber extrem leistungsfähige IDEs (Integrated Development Environments), z. B. PyCharm. Für Anfängerinnen sind diese jedoch weniger gut geeignet. Unsere Empfehlungen sind ebenso leistungsfähig, aber viel einfacher zu bedienen. + +Unsere Vorschläge siehst du unten. Aber fühl dich ganz frei, deine Trainerin zu fragen, was ihre Vorlieben sind - wenn sie sich mit dem Editor auskennt, wird es leichter sein, Hilfe zu erhalten. + +## Visual Studio Code + +Visual Studio Code ist ein von Microsoft entwickelter Quellcode-Editor für Windows, Linux und Mac. Es enthält Unterstützung für Debugging, eingebaute Git-Steuerung, Syntax-Highlighting, intelligente Code-Vervollständigung, Snippets und Code-Refactoring. + +[Du kannst ihn hier herunterladen](https://code.visualstudio.com/) + +## Gedit + +Gedit ist ein kostenloser Open-Source-Editor. Es gibt ihn für alle Betriebssysteme. + +[Du kannst ihn hier herunterladen](https://wiki.gnome.org/Apps/Gedit#Download) + +## Sublime Text + +Sublime Text ist ein sehr beliebter Editor, nutzbar für einen kostenlosen Testzeitraum. Er ist einfach zu installieren und zu verwenden, und er ist für alle Betriebssysteme verfügbar. + +[Du kannst ihn hier herunterladen](https://www.sublimetext.com/) + +## Atom + +Atom ist ein weiterer beliebter Editor. Er ist gratis, Open-Source und für Windows, macOS und Linux verfügbar. Atom wird von [GitHub](https://github.com/) entwickelt. + +[Du kannst ihn hier herunterladen](https://atom.io/) + +## Warum installieren wir einen Code-Editor? + +Vielleicht wunderst du dich, warum wir so spezielle Code-Editor-Software installieren, statt einfach etwas wie Word oder Notepad zu benutzen. + +Erstens muss Code "plain text" (unformatierter Text) sein. Das Problem mit Programmen wie Word und Textedit ist, dass sie nicht "plain text" sondern "rich text" (mit Schriftarten und Formatierungen) produzieren und besondere Formate wie RTF (Rich Text Format) verwenden. + +Ein weiterer Grund ist, dass Code-Editoren (bisweilen auch Programmier- oder Text-Editoren genannt) auf das Bearbeiten von Programm-Code spezialisiert sind und Funktionen aufweisen, die normale Textverarbeitungen nicht haben. Beispielsweise sogenanntes "Syntax-Highlighting", also farbliches Hervorheben bestimmter Code-Stellen, oder auch das automatische Schließen von Klammern und vieles mehr. + +Einiges davon werden wir später in Aktion sehen. Glaub uns: es wird nicht lange dauern, bis du deinen Code-Editor nicht mehr missen möchtest. :) diff --git a/de/css/README.md b/de/css/README.md new file mode 100644 index 00000000000..f439d56e9e9 --- /dev/null +++ b/de/css/README.md @@ -0,0 +1,330 @@ +# CSS - mach es hübsch! + +Unser Blog sieht immer noch ziemlich unfertig aus, oder? Zeit, das zu ändern! Dafür nutzen wir CSS. + +## Was ist CSS? + +Cascading Style Sheets (CSS) ist eine Sprache, die das Aussehen und die Formatierung einer Website beschreibt. Es handelt sich wie bei HTML um eine Auszeichnungssprache (Markup Language). Sie ist sowas wie das "Make-up" unserer Website. ;) + +Aber wir wollen nicht nochmal bei Null anfangen, oder? Einmal mehr werden wir etwas verwenden, dass ProgrammiererInnen entwickelt haben und gratis im Internet zur Verfügung stellen. Wir wollen ja nicht das Rad neu erfinden. + +## Lass uns Bootstrap verwenden! + +Bootstrap ist eines der bekanntesten HTML- und CSS-Frameworks für die Entwicklung von schönen Webseiten: https://getbootstrap.com/ + +Es wurde ursprünglich von ProgrammiererInnen bei Twitter geschrieben. Heute wird es von Freiwilligen aus der ganzen Welt weiterentwickelt! + +## Bootstrap installieren + +Öffne deine `.html`-Datei in deinem Code-Editor und füge Folgendes zum ``-Abschnitt hinzu, um Bootstrap zu installieren: + +{% filename %}blog/templates/blog/post_list.html{% endfilename %} + +```html + +``` + +Dadurch werden deinem Projekt keine Dateien hinzugefügt. Der Code verweist nur auf Dateien, die im Internet vorhanden sind. Öffne und aktualisiere also deine Webseite. Da ist sie! + + + +Sie sieht jetzt schon viel schöner aus! + +## Statische Dateien in Django + +Endlich werden wir einen genaueren Blick auf die Dinge werfen, die wir bisher **statische Dateien** genannt haben. Statische Dateien sind alle deine CSS- und Bilddateien. Ihr Inhalt hängt nicht vom Requestkontext ab, sondern gilt für alle Benutzer gleichermaßen. + +### Wohin kommen die statischen Dateien für Django + +Django weiss schon, wo die statischen Dateien für die integrierte "admin"-App zu finden sind. Wir müssen noch die statischen Dateien für unsere `blog`-App hinzufügen. + +Dies tun wir, indem wir einen Ordner namens `static` in der Blog-App erstellen: + + djangogirls + ├── blog + │ ├── migrations + │ ├── static + │ └── templates + └── mysite + + +Django findet automatisch alle Ordner mit dem Namen "static" in all unseren App-Ordnern. So ist es in der Lage, ihre Inhalte als statische Dateien zu nutzen. + +## Deine erste CSS-Datei! + +Erstellen wir nun eine CSS-Datei, um deiner Website deinen eigenen Stil zu verleihen. Erstelle ein neues Verzeichnis namens `css` in deinem `static`-Verzeichnis. Dann erstelle eine neue Datei namens `blog.css` in diesem `css`-Verzeichnis. Fertig? + + djangogirls + └─── blog + └─── static + └─── css + └─── blog.css + + +Zeit, ein wenig CSS zu schreiben! Öffne die `blog/static/css/blog.css` Datei in Deinem Code-Editor. + +Wir gehen nicht zu sehr auf die Details von CSS ein. Für diejenigen, die mehr über CSS lernen möchten, haben wir am Ende des Kapitels einen Link auf eine Empfehlung für einen kostenlosen CSS-Kurs angefügt. + +Aber lass uns wenigstens etwas Kleines probieren. Beispielsweise könnten wir die Farbe unserer Kopfzeile ändern. Computer benutzen spezielle Codes, um Farben zu verstehen. Diese Codes starten immer mit `#`, danach folgen sechs Buchstaben (A-F) und Zahlen (0-9). Blau zum Beispiel ist `#0000FF`. Beispiele für solche Farbcodes findest du hier: http://www.colorpicker.com/. Du kannst auch [vordefinierte Farben](http://www.w3schools.com/colors/colors_names.asp) wie `red` und `green` benutzen. + +In deiner `blog/static/css/blog.css` Datei änderst du den folgenden Code: + +{% filename %}blog/static/css/blog.css{% endfilename %} + +```css +h1 a, h2 a { + color: #C25100; +} + +``` + +`h1 a` ist ein CSS-Selektor. Das bedeutet, dass wir für ein `a`-Element innerhalb eines `h1`-Elements einen Style hinzufügen; der `h2 a`-Selektor macht das selbe für `h2`-Elemente. Wenn wir also etwas haben wie: `{{ post.text|linebreaksbr }}
+{{ post.text|linebreaksbr }}
+{{ post.text|linebreaksbr }}
+{{ post.text|linebreaksbr }}
+