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 84b4ed7b86d..751d6faf913 100644
--- a/LANGS.md
+++ b/LANGS.md
@@ -1,12 +1,20 @@
-* [English](en)
-* [Polski](pl)
-* [Українська](uk)
-* [简体中文](zh)
-* [Español (beta)](es)
-* [Français](fr)
-* [Português-brasileiro (beta)](pt/)
-* [Русский (beta)](ru)
-* [한국어 (beta)](ko)
-* [Italian (beta)](it)
-* [Magyar (beta)](hu)
-* [Türkçe (beta)](tr)
+* [🇺🇸 English](en/)
+* [🇧🇬 Български (beta)](bg/)
+* [🇨🇿 Čeština (beta)](cs/)
+* [🇩🇪 Deutsch](de/)
+* [🇬🇷 Ελληνικά (beta)](el/)
+* [🇪🇸 Español (beta)](es/)
+* [🇮🇷 فارسی (beta)](fa/)
+* [🇫🇷 Français (beta)](fr/)
+* [🇭🇺 Magyar (beta)](hu/)
+* [🇦🇲 հայերեն (beta)](hy/)
+* [🇮🇹 Italiano (beta)](it/)
+* [🇯🇵 日本語](ja/)
+* [🇰🇵/🇰🇷 한국어 (beta)](ko/)
+* [🇵🇱 Polski](pl/)
+* [🇧🇷 Português-brasileiro](pt/)
+* [🇷🇺 Русский (beta)](ru/)
+* [🇸🇰 Slovenčina (beta)](sk/)
+* [🇹🇷 Türkçe (beta)](tr/)
+* [🇺🇦 Українська](uk/)
+* [🇨🇳 简体中文](zh/)
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 00000000000..fcdd44ca093
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,2 @@
+This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License.
+To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/
\ No newline at end of file
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=]"
+ @echo
+ @echo " LANG: Language shortcodes are found in LANGS.md. Default is 'en'(English)."
+ @echo " ( Refer $(LANG_FILE) for shortcodes of Languages available. )"
+ @echo
+ @echo "Commands:"
+ @echo " help - Display make command list."
+ @echo " dev - Setup the project and start the development server with debugging enabled."
+ @echo " check - Check for the root directory for various dependencies."
+ @echo " setup - Setup the temporary language and install node dependencies for the development."
+ @echo " build - Build the honkit project."
+ @echo " build-dev - Build the honkit project with debug log."
+ @echo " serve - Start honkit server locally for development."
+ @echo " pdf - Generate the PDF version of DjangoGirls tutorial."
+ @echo " epub - Generate the EPUB version of DjangoGirls tutorial."
+ @echo " mobi - Generate the MOBI version of DjangoGirls tutorial."
+ @echo " mode - Shows the development mode status."
+ @echo " exit - Exit development mode."
+ @echo
+ @echo "Example:"
+ @echo
+ @echo "$$ make dev LANG=es"
+ @echo
+ @echo "The above command will start the development server using the language Español."
+ @echo "'LANG' argument is only required the first time until the exit command is executed."
+ @echo
+
+.git/hooks/pre-commit:
+ @echo "#!/bin/sh\n\
+\n\
+if test -f \"./.langs\"; then\n\
+ echo \"Error: You can't commit without exiting development mode.\\\n\\\n\\\\\
+\nTry the following command to exit development mode:\\\n\\\n\\\\\
+\n$$ make exit\\\n\" 1>&2;\n\
+ exit 1\n\
+fi\n" > ./.git/hooks/pre-commit
+ @chmod u+x ./.git/hooks/pre-commit
+
+node_modules:
+ @npm install
+
+check: package.json book.json LANGS.md
+ @if ! which node 1> /dev/null; then\
+ echo "Error: Node.js not found";\
+ echo " * Please install/reinstall NodeJS on your system.";\
+ echo " * NVM is recommended for installation (https://github.com/nvm-sh/nvm).";\
+ false;\
+ fi
+
+setup: node_modules check .git/hooks/pre-commit
+ @if ! test -f ".langs"; then\
+ cp LANGS.md .langs && \
+ echo "$(LANG_DATA)" > LANGS.md && \
+ echo "You are set to $(LANG_NAME) for development";\
+ fi
+
+build: setup
+ @npx honkit build
+
+build-dev: setup
+ @npx honkit build --log=debug
+
+serve: setup
+ @npx honkit serve
+
+dev: setup
+ @npx honkit serve --log=debug
+
+mode:
+ @if test -f ".langs"; then\
+ echo "You are in development mode using the language $(LANG_NAME)";\
+ else\
+ echo "You are not in development mode";\
+ fi
+
+exit:
+ @if test -f ".langs"; then\
+ mv -f .langs LANGS.md && echo "Language file is restored";\
+ rm -rf node_modules _book .git/hooks/pre-commit && echo "The project exited development mode.";\
+ fi
+
+pdf:
+ $(call ebook_support,pdf)
+
+epub:
+ $(call ebook_support,epub)
+
+mobi:
+ $(call ebook_support,mobi)
+
+.PHONY: help check setup build build-dev serve dev pdf epub mobi mode exit
diff --git a/README.md b/README.md
index 06ba9734434..75f6f9c1f29 100644
--- a/README.md
+++ b/README.md
@@ -1,42 +1,72 @@
+[](https://app.codeanywhere.com/#https://github.com/DjangoGirls/tutorial)
+
# Django Girls Tutorial
-This is the source code repository for the Django Girls Tutorial. Django Girls Tutorial is used on [tutorial.djangogirls.org](http://tutorial.djangogirls.org) so if you want to read it, please go there. If you want to contribute please do go further with this file.
+~ 🖥 Source Code 🖥 ~
+
+**NOT** intended for reading here. To read go to: [📖 tutorial.djangogirls.org 📖](https://tutorial.djangogirls.org)
+
+# Contribution QUICKSTART
+
+1. Fork this repo [[fork](#fork-the-repository)]
+
+> 2. **[Small changes](#simple-changes)**: you can now edit your fork on the github website, do this! Make a change, then [create a pull request](#making-a-pull-request)!
+
+2. **[Big changes](#new-content-and-complex-changes)**: clone your fork locally.
+3. [CLI](#cli-for-development) run `make dev` in repo.
+```
+$ make dev
+...
+Serving book on http://localhost:4000
+```
+
+Note: we have many changes under way we maybe working on your request already! Refer to existing [Pull requests](https://github.com/DjangoGirls/tutorial/pulls).
# How to contribute
-The Django Girls Tutorial is licensed under a *Creative Commons Attribution-ShareAlike 4.0* license. Everyone is free to add, edit and correct the tutorial.
+The Django Girls Tutorial is licensed under a [*Creative Commons Attribution-ShareAlike 4.0*](https://creativecommons.org/licenses/by-sa/4.0/) license. Everyone is free to add, edit and correct the tutorial.
# Editing basics
-The source code of the tutorial is [hosted on Github](http://github.com/DjangoGirls/tutorial). The Github [Fork & Pull workflow](https://help.github.com/articles/using-pull-requests) is used to accept and review changes.
+The source code of the tutorial is [hosted on GitHub](https://github.com/DjangoGirls/tutorial). The GitHub [Fork & Pull workflow](https://help.github.com/articles/using-pull-requests) is used to accept and review changes.
-The tutorial uses the [GitBook](https://www.gitbook.io/) service for publishing its documentation. [See more information about how Gitbook works](http://help.gitbook.io/).
+The tutorial uses the [HonKit](https://github.com/honkit/honkit) project for publishing its documentation. [See more information about how HonKit works](https://honkit.netlify.app/).
The tutorial is written in [Markdown mark up language](https://help.github.com/articles/markdown-basics).
-You can find any discussions about the contents of the tutorial on the [Github issue tracker](https://github.com/DjangoGirls/tutorial/issues).
+You can find any discussions about the contents of the tutorial on the [GitHub issue tracker](https://github.com/DjangoGirls/tutorial/issues).
+
+[Crowdin](https://crowdin.com/project/django-girls-tutorial) platform is used to manage translations. If you want to join an existing translation team or launch a new translation, send an email to the [translation managers](mailto:translations@djangogirls.org) or contact [support team](mailto:hello@djangogirls.org). If you want to propose some small changes or fix typos in existing translations, please create a Pull Request.
# Getting started and prerequisites
For contributing to the tutorial the following is needed to get started:
-* a [Github account](https://github.com)
-* in the case of complex edits familiarity with [Git command line basics](https://help.github.com/articles/set-up-git) or familiarity with an app ([Windows](https://windows.github.com/), [Mac](https://mac.github.com/)) to push your edits made on your computer to Github.
+* a [GitHub account](https://github.com)
+* in the case of complex edits familiarity with [Git command line basics](https://help.github.com/articles/set-up-git) or familiarity with an app ([Windows](https://windows.github.com/), [Mac](https://mac.github.com/)) to push your edits made on your computer to GitHub.
-## Fork the repository
+## Fork the repository {#fork-the-repository}
-First fork the [DjangoGirls/tutorial](https://github.com/DjangoGirls/tutorial) repository to your personal Github account:
+First fork the [DjangoGirls/tutorial](https://github.com/DjangoGirls/tutorial) repository to your personal GitHub account:

+## CLI for Development
+
+This command line tool use `make` to create development environment. It is optional to use this tool. While building the document, it builds the document for every language. The build process can be limited to any one language using this tool and reduce build time considerably. Afterwards, the translation to other languages are done from crowdin localization process.
+
+Usage instructions are available though `make help` command.
+
+Try the command `make dev` to start development process.
+
# Editing chapter content
## Simple changes
-For simple changes like typo corrections you can use the Github online editor:
+For simple changes like typo corrections you can use the GitHub online editor:
-* Open your local fork page on Github,
+* Open your local fork page on GitHub,
* go to *README.md* file in any chapter,
* press the *Edit* icon (pen)
@@ -46,29 +76,38 @@ and you can edit the chapter directly on github.com.
Markdown syntax is used to edit the individual pages of the tutorial.
-
+
Save your changes and create a pull request as explained below.
-## New content and complex changes
+## New content and complex changes {#new-content-and-complex-changes}
For adding new chapters, writing longer snippets of text or adding images, you need to get a copy of the tutorial to your local computer.
-Either use the Github app for your operating system (mentioned above) or `git` command line to get the repository locally. You get the repository address from the front page of your own Github repository fork:
+Either use the GitHub app for your operating system (mentioned above) or `git` command line to get the repository locally. You get the repository address from the front page of your own GitHub repository fork:
git clone git@github.com:yourgithubusername/tutorial.git
+Move to the folder containing the project, to run the following commands.
+
+ cd tutorial
+
Then, create a branch for your new changes to sit in. It helps to call the branch something related to the changes you are going to make.
git checkout -b contributing
-Download the [Gitbook Editor](https://github.com/GitbookIO/editor-legacy/releases) app to your computer.
+Install the project's requirements using [`npm`](https://docs.npmjs.com/cli/v8/configuring-npm/install).
+
+ npm install
-Then you can open the tutorial in Gitbook Editor (*File* > *Open book*).
+To preview and serve local files, with auto-reload capabilities, run HonKit using:
-Make any changes in the tutorial using Gitbook and then save changes (*Book* > *Save all*).
+ npx honkit serve
-Then commit the changes using `git` and push the changes to your remote Github repository.
+The local server will be available at http://localhost:4000.
+If auto-reload is slow, you can temporarily remove unwanted languages from `LANGS.md`, to speed up the process.
+
+Then commit the changes using `git` and push the changes to your remote GitHub repository.
Example:
@@ -94,26 +133,43 @@ Example:
Total 5 (delta 1), reused 0 (delta 0)
To git@github.com:miohtama/tutorial.git
b37ca59..fe36152 contributing -> contributing
-
-If you don't want to download the Gitbook Editor app you can also go to the [Gitbook website](http://gitbook.com), sign up for free and work directly in your browser.
-# Making a pull request
+# Restructuring the tutorial {#restructuring-the-tutorial}
+Restructuring the tutorial is a major change that takes time so we have created a separate branch for these changes.
+
+To make contributions that address issues
+[1777](https://github.com/DjangoGirls/tutorial/issues/1777) and [1792](https://github.com/DjangoGirls/tutorial/issues/1792),
+[fork](#fork-the-repository) the repository your repository.
+
+Next you need to follow instructions for [cloning and setting up locally given in the section above](#new-content-and-complex-changes).
-After you have finished your changes you need to create [a pull request](https://help.github.com/articles/using-pull-requests) on Github. DjangoGirls will get notified about the pull request, review your changes, suggest any corrections if needed and then *pull* your changes to the master version.
+Please make use of ["semantic linefeeds"](https://rhodesmill.org/brandon/2012/one-sentence-per-line/) a.k.a.
+["semantic line breaks"](https://sembr.org/) for all paragraphs.
+Though most of the Django Girls tutorial wasn't originally written that way, placing source line breaks at semantically meaningful spots in the text (and especially between sentences) facilitates both, commenting on individual statements or thoughts in the text as part of the review process, as well as future editing and diff-ing.
-In your own repository on Github press do *Compare & pull request*
+As we restructure the tutorial, this would be a great change to introduce to the tutorial so please make sure the chapter you work on follow this pattern.
-
+All pull requests for changes aimed at restructuring the tutorial which address the issues
+[1777](https://github.com/DjangoGirls/tutorial/issues/1777) and [1792](https://github.com/DjangoGirls/tutorial/issues/1792)
+should be made to the `restructure-tutorial`.
+
+All other steps for creating a pull request are the same as those outlined in the section on [making a pull request below](#making-a-pull-request), just make sure you make the pull request against the `restructure-tutorial` branch.
+
+# Making a pull request {#making-a-pull-request}
+After you have finished your changes you need to [create a pull request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request) on GitHub. DjangoGirls will get notified about the pull request, review your changes, suggest any corrections if needed and then *pull* your changes to the master version.
+
+In your own repository on GitHub press do *Compare & pull request*
+
+
Fill in the information *why* this change is being made. The reviewer can see the details of the actual change, so you don't need repeat the content of the change.
Then press *Create pull request*.
-Github emails will notify you for the follow up process.
+GitHub emails will notify you for the follow up process.
# Further information and help
GitHub has an excellent [documentation](https://help.github.com/). Check it out if you need help!
-For further questions please [contact DjangoGirls](http://djangogirls.org/).
-
+For further questions please [contact DjangoGirls](https://djangogirls.org/).
diff --git a/SUMMARY.md b/SUMMARY.md
deleted file mode 100644
index ac9323cbcb8..00000000000
--- a/SUMMARY.md
+++ /dev/null
@@ -1 +0,0 @@
-# Summary
diff --git a/bg/GLOSSARY.md b/bg/GLOSSARY.md
new file mode 100644
index 00000000000..92a2c38234c
--- /dev/null
+++ b/bg/GLOSSARY.md
@@ -0,0 +1,3 @@
+# редактор на код
+
+Редакторът на код е приложение, което ти позволява да съхраняваш своя код за да можеш да продължиш с него по-късно. Може да научиш откъде да свалиш от [главата Редактор на код](./code_editor/README.md)
\ No newline at end of file
diff --git a/bg/README.md b/bg/README.md
new file mode 100644
index 00000000000..43886769177
--- /dev/null
+++ b/bg/README.md
@@ -0,0 +1,51 @@
+# Django Girls ръководство
+
+[](https://gitter.im/DjangoGirls/tutorial)
+
+> Тази работа е лицензирана под Creative Commons Attribution-ShareAlike 4.0 International License. За да видите копие на този лиценз, посетете https://creativecommons.org/licenses/by-sa/4.0/
+
+## Добре дошли
+
+Добре дошли в ръководството на Django Girls! Щастливи сме да те видим тук :) Ще те отведем на приключение зад кулисите на уеб-технологиите, като хвърлим бегъл поглед на всичко, което е необходимо за да накараме мрежата да проработи, така както я знаем.
+
+Както с всички непознати неща, това може да бъде малко трудно. Но не се притеснявай, вече имаш кураж да бъдеш тука, всичко ще бъде наред :)
+
+## Въведение
+
+Някога имал ли си чувтвото, че светът е свързан все повече и повече с технологиите и ти не си още част от него? Чудил ли си се как да създадеш уеб-сайт, но никога си нямал достатъчно мотивация да започнеш? Струвало ли ти се, че светът на софтуера е прекалено сложен за да започнеш да правиш нещо сам?
+
+Имаме добра новина за теб! Програмиране не е толкова трудно, колкото изглежда, и ние искаме да ти покажем колко лесно може да бъде това.
+
+Това ръководство няма магически да те превърне в програмист. Ако искаш да си добър ще ти трябват месеци или даже години учене и упражняване. Но ние искаме да покажем, че програмиране или създаване на уеб-сайтове не е толкова сложно, колкото изглежда. Ще се постараем да обясним в детайли, колкото се може по-добре, за да не се чувстваш уплашен от технологията.
+
+Надяваме се да те накараме да заобичаш технология толкова, колкото и ние я обичаме!
+
+## Какво ще научиш от това ръководство?
+
+След като приключиш с ръководството, ще имаш малко работещо уеб-приложение: твой собствен блог. Ще ти покажем как да го пуснеш в мрежата, така че другите да ти видят работата!
+
+Това ще изглежда (горе-долу) ето така:
+
+
+
+> Ако работиш с ръкводството сам, и нямаш инструктор който да ти помага в случай на някой проблем, имаме чат система за теб: [](https://gitter.im/DjangoGirls/tutorial). Помолихме нашите инструктори и миналите участници да са там от време на време и да помагат на другите с ръководството! Не се страхувай да задаваш въпроси тука!
+
+Добре, [хайде да започнем от начало...](./how_the_internet_works/README.md)
+
+## Следвайки ръководството вкъщи
+
+Изумително е да си част от занятията на Django Girls, но също разбираме, че не винаги е възможно да присъстваш на някое от тях. Затова ние те насърчаваме да пробваш да следиш ръководството вкъщи. За читатели у дома, понастоящем приготвяме видеа, които ще улеснят следването на ръководството само по себе си. Проектът е все още в процес на обработка, но все повече и повече неща скоро ще бъдат покрити на [Coding is for girls](https://www.youtube.com/channel/UC0hNd2uW8jTR5K3KBzRuG2A/feed) YouTube канал.
+
+Във всяка вече покрита глава има линк, препращащ към съответното видео.
+
+## Относно и допринасяне
+
+Това ръководство е поддържано от [Django Girls](https://djangogirls.org/). Ако си намерил някакви грешки или искаш да актуализираш ръководството, моля, [следвай насоките за допринасяне](https://github.com/DjangoGirls/tutorial/blob/master/README.md).
+
+## Би ли искал да ни помогнеш да преведем ръководството на друг език?
+
+Понастоящем, преводите се съхраняват на платформа crowdin.com на този адрес:
+
+https://crowdin.com/project/django-girls-tutorial
+
+Ако твоят език не е изброен на [crowdin](https://crowdin.com/), моля [оставете заявка](https://github.com/DjangoGirls/tutorial/issues/new), информирайки ни за езика, за да можем да го добавим.
\ No newline at end of file
diff --git a/bg/SUMMARY.md b/bg/SUMMARY.md
new file mode 100644
index 00000000000..c6859e9e51b
--- /dev/null
+++ b/bg/SUMMARY.md
@@ -0,0 +1,35 @@
+# Обобщение
+
+* [Въведение](README.md)
+* [Инсталиране](installation/README.md)
+ * [Команден ред](installation/README.md#command-line)
+ * [Python](installation/README.md#python)
+ * [Редактор на код](installation/README.md#code-editor)
+ * [Виртуална среда](installation/README.md#virtualenv)
+ * [Django](installation/README.md#django)
+ * [Git](installation/README.md#git)
+ * [GitHub](installation/README.md#github)
+ * [PythonAnywhere](installation/README.md#pythonanywhere)
+* [Инсталиране (chromebook)](chromebook_setup/README.md)
+* [Как работи интернет](how_the_internet_works/README.md)
+* [Въведение в команден ред](intro_to_command_line/README.md)
+* [Инсталиране на Python](python_installation/README.md)
+* [Редактор на код](code_editor/README.md)
+* [Въведение в Python](python_introduction/README.md)
+* [Какво е Django?](django/README.md)
+* [Инсталиране на Django](django_installation/README.md)
+* [Вашият първи проект с Django!](django_start_project/README.md)
+* [Django модели](django_models/README.md)
+* [Администриране на Django](django_admin/README.md)
+* [Внедряване!](deploy/README.md)
+* [Django URL адреси](django_urls/README.md)
+* [Django изгледи - време за създаване!](django_views/README.md)
+* [Въведение в HTML](html/README.md)
+* [Django ORM (Querysets)](django_orm/README.md)
+* [Динамични данни в шаблони](dynamic_data_in_templates/README.md)
+* [Django шаблони](django_templates/README.md)
+* [CSS - направи го красиво](css/README.md)
+* [Разширяване на шаблони](template_extending/README.md)
+* [Разшири своето приложение](extend_your_application/README.md)
+* [Django Форми](django_forms/README.md)
+* [Какво следва?](whats_next/README.md)
\ No newline at end of file
diff --git a/bg/chromebook_setup/README.md b/bg/chromebook_setup/README.md
new file mode 100644
index 00000000000..d21dc1f556d
--- /dev/null
+++ b/bg/chromebook_setup/README.md
@@ -0,0 +1,5 @@
+# Настройка на Chromebook
+
+> **Бележка** Ако вече сте минали през стъпките за инсталиране, няма нужда да правите това отново - можете да прескочите направо към [Въведение в Python](../python_introduction/README.md).
+
+{% include "/chromebook_setup/instructions.md" %}
\ No newline at end of file
diff --git a/bg/chromebook_setup/instructions.md b/bg/chromebook_setup/instructions.md
new file mode 100644
index 00000000000..5befa2aaec6
--- /dev/null
+++ b/bg/chromebook_setup/instructions.md
@@ -0,0 +1,73 @@
+Можеш да [пропуснеш този раздел](http://tutorial.djangogirls.org/en/installation/#install-python), ако не използваш Chromebook. Ако използвате, опитът ви в инсталацията ще бъде малко по-различен. Можете да игнорирате останалата част от инструкциите за инсталиране.
+
+### Cloud IDE (PaizaCloud Cloud IDE, AWS Cloud9)
+
+Cloud IDE е инструмент, който ти дава редактор на код и достъп до компютър, работещ с Интернет, където можеш да инсталираш, пишеш и пускаш софтуер. За продължителността на ръководството, cloud IDE ще ти служи като твоя *локална машина*. Все пак ще пишеш команди в терминал, също като твоите съученици на macOS, Ubuntu или Windows, но той ще бъде свързан с компютър, работещ някъде другаде, който cloud IDE прави за теб. Ето инструкциите за cloud IDE (PaizaCloud Cloud IDE, AWS Cloud9). Можете да изберете един от cloud IDE интерфейси и да следвате инструкциите за cloud IDE.
+
+#### PaizaCloud Cloud IDE
+
+1. Отиди на [PaizaCloud Cloud IDE](https://paiza.cloud/)
+2. Направи акаунт
+3. Натисни *New Server* и избери Django приложение
+4. Натисни бутон на Терминал (от лявата страна на прозореца)
+
+Сега трябва да виждаш интерфейс със странична лента, бутони са отляво. Натисни бутона "Terminal" за да ви отвори прозорец със следния надпис:
+
+{% filename %}Terminal{% endfilename %}
+
+ $
+
+
+Терминалът на PaizaCloud Cloud IDE е готов за твоите инструции. Можеш да увеличиш прозореца за да го направиш малко по-голям.
+
+#### AWS Cloud9
+
+Понастоящем, Cloud 9 изисква от теб да се регистрираш с AWS и да въведеш информация за кредитната си карта.
+
+1. Инсталирай Cloud 9 от [Chrome web store](https://chrome.google.com/webstore/detail/cloud9/nbdmccoknlfggadpfkmcpnamfnbkmkcp)
+2. Отиди на [c9.io](https://c9.io) и натисни *Get started with AWS Cloud9*
+3. Регистрирай се за AWS акаунт (изисква информация за кредитна карта, но можеш да го използваш безплатно)
+4. В AWS Dashboard, напиши *Cloud9* в лентата за търсене и натисни
+5. В Cloud 9 таблото, натисни *Create environment*
+6. Наречи го *django-girls*
+7. Конфигурирайки настройките, избери *Create a new instance for environment (EC2)* за "Environment Type" и *t2.micro* "Instance type" (трябва да пише "Free-tier eligible."). Настройката за икономия на разходи по подразбиране е добре, също може да запазиш и другите както са по подразбиране.
+8. Натисни *Next step*
+9. Натисни *Create environment*
+
+Сега трябва да видите интерфейс със странична лента, голям основен прозорец с малко текст и малък прозорец в долната част, който изглежда като нещо подобно:
+
+{% filename %}bash{% endfilename %}
+
+ yourusername:~/workspace $
+
+
+Тази долна зона е вашият терминал. Можете да използвате терминала за изпращане на инструкции до отдалечения компютър Cloud 9. Можете да промените размера на прозореца, за да го направите малко по-голям.
+
+### Виртуална среда
+
+Виртуална среда (наричана още virtualenv) е като частна кутия, в която можем да запълним полезен компютърен код за проект, над който работим. Ние ги използваме, за да държим различните части от код, които искаме за отделните ни проекти, разделени, така че нещата да не се смесват между проектите.
+
+Пусни:
+
+{% filename %}Cloud 9{% endfilename %}
+
+ mkdir djangogirls
+ cd djangogirls
+ python3.6 -mvenv myvenv
+ source myvenv/bin/activate
+ pip install django~={{ book.django_version }}
+
+
+(имайте предвид, че на последния ред използваме тилд, последван от знак за равенство: `~=`).
+
+### GitHub
+
+Направи [GitHub](https://github.com) акаунт.
+
+### PythonAnywhere
+
+Урокът за Django Girls включва раздел за това, което се нарича Прехвърляне, което е процесът на приемане на кода, който захранва новото ви уеб приложение и го премества на обществено достъпен компютър (наречен сървър), за да могат другите хора да виждат работата ви.
+
+Тази част е малко странна, когато правим урока в Chromebook, тъй като вече използваме компютър, който е в Интернет (за разлика от, да речем, лаптоп). Въпреки това, все още е полезно, тъй като можем да мислим за работното пространство на Cloud 9 като място за нашата „текуща“ работа и Python Anywhere като място за показване на нашите неща, когато те станат по-завършени.
+
+По този начин се регистрирайте за нов акаунт в Python Anywhere на адрес [www.pythonanywhere.com](https://www.pythonanywhere.com).
\ No newline at end of file
diff --git a/bg/code_editor/README.md b/bg/code_editor/README.md
new file mode 100644
index 00000000000..8d3daf476a1
--- /dev/null
+++ b/bg/code_editor/README.md
@@ -0,0 +1,11 @@
+# Редактор на код
+
+> За читателите у дома: тази глава е разгледана във видеото [Инсталиране на Python & Редактор на код](https://www.youtube.com/watch?v=pVTaqzKZCdA&t=4m43s).
+
+На път сте да напишете първия си ред код, така че е време да изтеглите редактор на код!
+
+> **Забележка** Ако използвате Chromebook, пропуснете тази глава и се уверете, че следвате инструкциите [Настройка на Chromebook](../chromebook_setup/README.md). Облачният IDE, който сте избрали (PaizaCloud Cloud IDE или AWS Cloud9) включва редактор на код и когато отворите файл във вашия IDE от менюто File, автоматично ще използвате редактора.
+>
+> ** Забележка ** Може да сте направили това по-рано в главата за инсталиране - ако е така, можете да прескочите веднага до следващата глава!
+
+{% include "/code_editor/instructions.md" %}
\ No newline at end of file
diff --git a/bg/code_editor/instructions.md b/bg/code_editor/instructions.md
new file mode 100644
index 00000000000..1d57820cc32
--- /dev/null
+++ b/bg/code_editor/instructions.md
@@ -0,0 +1,37 @@
+Има много различни редактори и това до голяма степен се свежда до личните предпочитания. Повечето програмисти на Python използват сложни, но изключително мощни IDE (интегрирани среди за разработка), като PyCharm. Като начинаещ обаче това вероятно е по-малко подходящо; нашите препоръки са еднакво мощни, но много по-прости.
+
+Нашите предложения са по-долу, но не се колебайте да попитате ментора си какви са техните предпочитания - по-лесно ще получите помощ от тях.
+
+## Visual Studio Code
+
+Visual Studio Code е редактор за програмен код, разработен от Microsoft за Windows, Linux и macOS. Той включва поддръжка за отстраняване на грешки, вграден Git контрол, подчертаване на синтаксис, интелигентно попълване на код, фрагменти и рефакторинг на код.
+
+[Изтеглете го тук](https://code.visualstudio.com/)
+
+## Gedit
+
+Gedit е безплатен редактор с отворен код, достъпен за всички операционни системи.
+
+[Изтеглете го тук](https://wiki.gnome.org/Apps/Gedit#Download)
+
+## Sublime Text
+
+Sublime Text е много популярен редактор с безплатен период за ползване и е достъпен за всички операционни системи.
+
+[Изтеглете го тук](https://www.sublimetext.com/)
+
+## Atom
+
+Atom е друг популярен редактор. Той е безплатен, с отворен код и се предлага за Windows, macOS и Linux. Atom е разработен от [GitHub](https://github.com/).
+
+[Изтеглете го тук](https://atom.io/)
+
+## Защо инсталираме редактор на код?
+
+Може би се чудите защо инсталираме този специален софтуер за редактиране на код, вместо да използваме нещо като Word или Notepad.
+
+Първата причина е, че кодът трябва да бъде **обикновен текст**, а проблемът с програми като Word и Textedit е, че те всъщност не произвеждат обикновен текст, те създават богат текст (с шрифтове и форматиране), използвайки персонализирани формати като [RTF (формат на обогатен текст)](https://en.wikipedia.org/wiki/Rich_Text_Format).
+
+Втората причина е, че редакторите на код са специализирани за редактиране на код, така че те могат да предоставят полезни функции като подчертаване на код с цвят според значението му или автоматично затваряне на кавички.
+
+Ще видим всичко това в действие по-късно. Скоро ще помислите за надеждния си стар редактор на код като за един от любимите си инструменти. :)
diff --git a/bg/css/README.md b/bg/css/README.md
new file mode 100644
index 00000000000..f73e52a41be
--- /dev/null
+++ b/bg/css/README.md
@@ -0,0 +1,305 @@
+# CSS - направи го красиво!
+
+Блогът ни все още изглежда доста грозен, нали? Време е да го направите хубав! За това ще използваме CSS.
+
+## Какво е CSS?
+
+Cascading Style Sheets (CSS) е език, използван за описание на външния вид и форматирането на уебсайт, написан на език за маркиране (като HTML). Отнасяйте се към него като грим за вашата уеб страница. ;)
+
+Но не искаме отново да започнем от нулата, нали? Още веднъж ще използваме нещо, което програмистите пуснаха в интернет безплатно. Преосмислянето на колелото не е забавно.
+
+## Нека използваме Bootstrap!
+
+Bootstrap е една от най-популярните фреймуорки за HTML и CSS за разработване на красиви уебсайтове: https://getbootstrap.com/
+
+Той е написан от програмисти, които са работили за Twitter. Сега тя е разработена от доброволци от цял свят!
+
+## Инсталирайте Bootstrap
+
+За да инсталирате Bootstrap, отворете вашия файл `.html` в редактора на кода и го добавете в секцията ``:
+
+{% filename %}blog/templates/blog/post_list.html{% endfilename %}
+
+```html
+
+
+```
+
+Това не добавя никакви файлове към вашия проект. Той просто сочи файлове, които съществуват в Интернет. Затова продължете напред, отворете уебсайта си и актуализирайте страницата. Ето го!
+
+
+
+Вече изглежда по-хубав!
+
+## Статични файлове в Django
+
+Накрая ще разгледаме по-подробно тези неща, които наричахме **статични файлове**. Статичните файлове са всички ваши CSS и изображения. Съдържанието им не зависи от контекста на заявката и ще бъде едно и също за всеки потребител.
+
+### Къде да сложа статични файлове за Django
+
+Django вече знае къде да намери статичните файлове за вграденото приложение "admin". Сега трябва да добавим статични файлове за нашето собствено приложение, `blog`.
+
+Правим това, като създаваме папка, наречена `static` в блог приложението:
+
+ djangogirls
+ ├── blog
+ │ ├── migrations
+ │ ├── static
+ │ └── templates
+ └── mysite
+
+
+Django автоматично ще открива всички папки, наречени 'static', в която и да е от папките на вашите приложения. Тогава той ще може да използва тяхното съдържание като статични файлове.
+
+## Вашият първи CSS файл!
+
+Нека сега създадем CSS файл, за да добавим свой собствен стил към вашата уеб страница. Създайте нова директория, наречена `css` във вашата `static` директория. След това създайте нов файл, наречен `blog.css` вътре в тази директория `css`. Готови?
+
+ djangogirls
+ └─── blog
+ └─── static
+ └─── css
+ └─── blog.css
+
+
+Време е да напишете малко CSS! Отворете файла `blog/static/css/blog.css` във вашия редактор на код.
+
+Тук няма да навлизаме твърде дълбоко в персонализирането и научаването на CSS. Има препоръка за безплатен CSS курс в края на тази страница, ако искате да научите повече.
+
+Но нека направим поне малко. Може би бихме могли да променим цвета на заглавията си? За да разберат цветовете, компютрите използват специални кодове. Тези кодове започват с `#`, последвани от 6 букви (A–F) и цифри (0–9). Например кодът за синьо е `#0000FF`. Можете да намерите цветовите кодове за много от цветовете тук: http://www.colorpicker.com/. Можете също така да използвате [предварително определени цветове](http://www.w3schools.com/colors/colors_names.asp), като ` red ` и ` green `.
+
+Във вашия `blog/static/css/blog.css` файл трябва да добавите следния код:
+
+{% filename %}blog/static/css/blog.css{% endfilename %}
+
+```css
+h1 a, h2 a {
+ color: #C25100;
+}
+
+```
+
+`h1 a` е CSS селектор. Това означава, че прилагаме стиловете си към всеки `a` елемент вътре в елемент `h1`; селекторът `h2 a` прави същото за елементи `h2`. Така че, когато имаме нещо като `
+ {% endfor %}
+
+
+```
+
+ОК, запазете файла и актуализирайте сайта!
+
+
+
+Добра работа! Може би също бихме искали да дадем на нашия уебсайт малко въздух и да увеличим полето от лявата страна? Нека опитаме това!
+
+{% filename %}blog/static/css/blog.css{% endfilename %}
+
+```css
+body {
+ padding-left: 15px;
+}
+```
+
+Добавете това към вашия CSS, запишете файла и вижте как работи!
+
+
+
+Може би можем да персонализираме шрифта в заглавието ни? Поставете това във вашия `` в `blog/templates/blog/post_list.html` файл:
+
+{% filename %}blog/templates/blog/post_list.html{% endfilename %}
+
+```html
+
+```
+
+Както и преди, проверете поръчката и поставете преди връзката към `blog/static/css/blog.css`. Този ред ще импортира шрифт, наречен *Lobster* от Google Fonts (https://www.google.com/fonts).
+
+Намерете блока за деклариране `h1 a` (кодът между скобите `{` и `}`) в CSS файла `blog/static/css/blog.css`. Сега добавете ред `font-family: 'Lobster';` между скобите и актуализирайте страницата:
+
+{% filename %}blog/static/css/blog.css{% endfilename %}
+
+```css
+h1 a, h2 a {
+ color: #C25100;
+ font-family: 'Lobster';
+}
+```
+
+
+
+Страхотно!
+
+Както бе споменато по-горе, CSS има концепция за класове. Те ви позволяват да назовете част от HTML кода и да приложите стилове само към тази част, без да засягате други части. Това може да бъде супер полезно! Може би имате два divs (участъка), които правят нещо различно (като заглавието и публикацията ви). Един клас може да ви помогне да ги направите да изглеждат различно.
+
+Продължете и дайте име на някои части от HTML кода. Добавете клас, наречен `page-header`, към вашия `div`, който съдържа заглавието ви, като този:
+
+{% filename %}blog/templates/blog/post_list.html{% endfilename %}
+
+```html
+
+```
+
+Запазете тези файлове и актуализирайте уебсайта си.
+
+
+
+Ура! Изглежда страхотно, нали? Вижте кода, който току-що поставихме, за да намерите местата, където добавихме класове в HTML и ги използвахме в CSS. Къде бихте направили промяната, ако искате датата да е тюркоазена?
+
+Не се страхувайте да се поинтересувате с този CSS малко и се опитайте да промените някои неща. Играта с CSS може да ви помогне да разберете какво правят различните неща. Ако счупите нещо, не се притеснявайте - винаги можете да го отмените!
+
+Наистина препоръчваме да вземете безплатните онлайн курсове "Basic HTML & HTML5" и "Basic CSS" на [freeCodeCamp](https://learn.freecodecamp.org/). Те могат да ви помогнат да научите всичко за правенето на уебсайтовете ви по-красиви с HTML и CSS.
+
+Готови ли сте за следващата глава?! :)
\ No newline at end of file
diff --git a/bg/css/images/bootstrap1.png b/bg/css/images/bootstrap1.png
new file mode 100644
index 00000000000..bd81cd14373
Binary files /dev/null and b/bg/css/images/bootstrap1.png differ
diff --git a/bg/css/images/color2.png b/bg/css/images/color2.png
new file mode 100644
index 00000000000..3f82e7d3922
Binary files /dev/null and b/bg/css/images/color2.png differ
diff --git a/bg/css/images/final.png b/bg/css/images/final.png
new file mode 100644
index 00000000000..067c83d36cc
Binary files /dev/null and b/bg/css/images/final.png differ
diff --git a/bg/css/images/font.png b/bg/css/images/font.png
new file mode 100644
index 00000000000..310f9e85f18
Binary files /dev/null and b/bg/css/images/font.png differ
diff --git a/bg/css/images/margin2.png b/bg/css/images/margin2.png
new file mode 100644
index 00000000000..895828b688d
Binary files /dev/null and b/bg/css/images/margin2.png differ
diff --git a/bg/deploy/README.md b/bg/deploy/README.md
new file mode 100644
index 00000000000..fc814929882
--- /dev/null
+++ b/bg/deploy/README.md
@@ -0,0 +1,222 @@
+# Внедряване!
+
+> **Забележка** Следващата глава понякога може да бъде малко трудна за преминаване. Продължете и я завършете; внедряването е важна част от процеса на разработване на уебсайтове. Тази глава е поставена в средата на урока, така че вашият ментор да ви помогне с малко по-сложния процес на вдигане на уебсайта ви онлайн. Това означава, че все още можете да завършите урока самостоятелно, ако ви липсва време.
+
+Досега вашият уебсайт беше достъпен само на вашия компютър. Сега ще научите как да го прехвърлите в онлайн пространството! Разгръщането е процесът на публикуване на приложението ви в Интернет, така че хората най-накрая да могат да отидат и да видят приложението ви. :)
+
+Както научихте, уебсайт трябва да бъде разположен на сървър. В интернет има много доставчици на сървъри, ще използваме [PythonAnywhere](https://www.pythonanywhere.com/). PythonAnywhere е безплатен за малки приложения, които нямат твърде много посетители, така че определено засега ще ви бъде достатъчно.
+
+Другата външна услуга, която ще използваме е [GitHub](https://www.github.com), която е услуга за хостинг на код. Има и други, но почти всички програмисти имат GitHub акаунт в наши дни, а сега и вие!
+
+Тези три места ще бъдат важни за вас. Вашият локален компютър ще бъде мястото, където правите разработка и тестване. Когато сте доволни от промените, ще поставите копие на програмата си в GitHub. Вашият уебсайт ще бъде на PythonAnywhere и ще го актуализирате, като получите ново копие на вашия код от GitHub.
+
+# Git
+
+> **Забележка** Ако вече сте направили стъпките за инсталиране, няма нужда да правите това отново - можете да преминете към следващия раздел и да започнете да създавате вашето Git хранилище.
+
+{% include "/deploy/install_git.md" %}
+
+## Стартираме нашето Git хранилище
+
+Git проследява промените в определен набор от файлове в т.нар. склад (или за кратко "репо"). Нека започнем еднo за нашия проект. Отворете конзолата и стартирайте тези команди в директорията `djangogirls`:
+
+> **Забележка** Проверете текущата си работна директория с команда `pwd` (macOS / Linux) или `cd` (Windows), преди да инициализирате хранилището. Трябва да сте в папката `djangogirls`.
+
+{% filename %}command-line{% endfilename %}
+
+ $ git init
+ Initialized empty Git repository in ~/djangogirls/.git/
+ $ git config --global user.name "Your Name"
+ $ git config --global user.email you@example.com
+
+
+Инициализирането на git хранилището е нещо, което трябва да направим само веднъж за всеки проект (и няма да се налага да въвеждате отново потребителското име и имейла).
+
+Git ще проследи промените във всички файлове и папки в тази директория, но има някои файлове, които искаме да игнорира. Правим това чрез създаване на файл, наречен `.gitignore` в основната директория. Отворете редактора си и създайте нов файл със следното съдържание:
+
+{% filename %}.gitignore{% endfilename %}
+
+ *.pyc
+ *~
+ /.vscode
+ __pycache__
+ myvenv
+ db.sqlite3
+ /static
+ .DS_Store
+
+
+И го запишете като `.gitignore` в папката "djangogirls".
+
+> **Забележка** Точката в началото на името на файла е важна! Ако имате проблеми с създаването му (Macs не харесва да създавате файлове, които започват с точка чрез Finder, например), след това използвайте функцията "Save As" в редактора си; това е бронеустойчиво. И не забравяйте да добавите `.txt`, `.py` или друго разширение към името на файла - той ще бъде разпознат от Git само ако името е просто `.gitignore`.
+>
+> **Забележка** Един от файловете, които сте посочили във вашия `.gitignore` файл е `db.sqlite3`. Този файл е вашата локална база данни, където се съхраняват всички ваши потребители и публикации. Ще следваме стандартната практика за уеб програмиране, което означава, че ще използваме отделни бази данни за вашия локален тестващ сайт и вашия уеб сайт на живо в PythonAnywhere. Базата данни на PythonAnywhere може да бъде SQLite, като вашата разработваща машина, но обикновено ще използвате такава, наречена MySQL, която може да се справи с много повече посетители на сайта, отколкото SQLite. Така или иначе, като игнорирате вашата SQLite база данни за копието на GitHub, това означава, че всички публикувани досега публикации и superuser ще бъдат достъпни само локално и ще трябва да създавате нови в производството. Трябва да мислите за вашата локална база данни като за добра площадка, където можете да тествате различни неща и да не се страхувате, че ще изтриете истинските си публикации от блога.
+
+Добра идея е да използвате команда `git status` преди `git add` или винаги, когато се окажете несигурни какво се е променило. Това ще ви помогне да предотвратите появата на изненади, като например добавяне или поемане на грешни файлове. Командата `git status` връща информация за всички непроследени/модифицирани/поетапни файлове, състоянието на клона и много други. Изходът трябва да бъде подобен на следното:
+
+{% filename %}command-line{% endfilename %}
+
+ $ git status
+ On branch master
+
+ No commits yet
+
+ Untracked files:
+ (use "git add ..." to include in what will be committed)
+
+ .gitignore
+ blog/
+ manage.py
+ mysite/
+ requirements.txt
+
+ nothing added to commit but untracked files present (use "git add" to track)
+
+
+И накрая спестяваме промените си. Отидете на конзолата си и изпълнете следните команди:
+
+{% filename %}command-line{% endfilename %}
+
+ $ git add --all .
+ $ git commit -m "My Django Girls app, first commit"
+ [...]
+ 13 files changed, 200 insertions(+)
+ create mode 100644 .gitignore
+ [...]
+ create mode 100644 mysite/wsgi.py
+
+
+## Избутване на кода ви към GitHub
+
+Отидете на [GitHub.com](https://www.github.com) и се регистрирайте за нов безплатен потребителски акаунт. (Ако вече сте го направили в подготвителната работилница, това е чудесно!) Не забравяйте да запомните паролата си (добавете я към вашия мениджър на пароли, ако използвате такъв).
+
+След това създайте ново хранилище, като му дадете името "my-first-blog". Оставете квадратчето за „инициализация с README“ отместено, оставете опцията .gitignore празна (направихме това ръчно) и оставете лиценза като None.
+
+
+
+> **Забележка** Името `my-first-blog` е важно - бихте могли да изберете нещо друго, но това ще се случва много пъти в инструкциите по-долу и ще трябва да го замествате всеки път. Вероятно е по-лесно да се придържаме към името `my-first-blog`.
+
+На следващия екран ще се покаже URL за клониране на вашия склад, което ще използвате в някои от следващите команди:
+
+
+
+Сега трябва да свържем Git хранилището на вашия компютър към това в GitHub.
+
+Въведете следното в конзолата си (заменете `` с потребителското име, което сте въвели, когато сте създали акаунта си в GitHub, но без скобите - URL адресът трябва да съответства на клонирания URL адрес, който току-що видяхте):
+
+{% filename %}command-line{% endfilename %}
+
+ $ git remote add origin https://github.com//my-first-blog.git
+ $ git push -u origin master
+
+
+Когато избутате кода към GitHub, ще бъдете попитани за вашето потребителско име и парола за GitHub (било то в прозореца на командния ред или в изскачащ прозорец), а след въвеждане на идентификационни данни трябва да видите нещо подобно:
+
+{% filename %}command-line{% endfilename %}
+
+ Counting objects: 6, done.
+ Writing objects: 100% (6/6), 200 bytes | 0 bytes/s, done.
+ Total 3 (delta 0), reused 0 (delta 0)
+ To https://github.com/ola/my-first-blog.git
+
+ * [new branch] master -> master
+ Branch master set up to track remote branch master from origin.
+
+
+
+
+Кодът ви вече е на GitHub. Отидете и го вижте! Ще откриете, че е в добра компания - [Django](https://github.com/django/django), [Django Girls Tutorial](https://github.com/DjangoGirls/tutorial) и много други страхотни софтуерни проекти с отворен код също са домакини на кода си в GitHub. :)
+
+# Настройване на нашия блог на PythonAnywhere
+
+## Регистрирайте се за акаунт в PythonAnywhere
+
+> **Забележка** Може би вече сте създали акаунт в PythonAnywhere по-рано по време на стъпките за инсталиране - ако е така, няма нужда да го правите отново.
+
+{% include "/deploy/signup_pythonanywhere.md" %}
+
+## Конфигуриране на нашия сайт на PythonAnywhere
+
+Върнете се към главното меню [PythonAnywhere Dashboard](https://www.pythonanywhere.com/), като кликнете върху логото и изберете опцията за стартиране на конзола "Bash" - това е версията на командния ред PythonAnywhere, точно като тази на вашия компютър.
+
+
+
+> **Забележка** PythonAnywhere е базиран на Linux, така че ако сте на Windows, конзолата ще изглежда малко по-различна от тази на вашия компютър.
+
+Внедряването на уеб приложение в PythonAnywhere включва сваляне на кода от GitHub и конфигуриране на PythonAnywhere да го разпознае и да започне да го обслужва като уеб приложение. Има ръчни начини за това, но PythonAnywhere предоставя помощен инструмент, който ще свърши всичко за вас. Нека го инсталираме първо:
+
+{% filename %}PythonAnywhere command-line{% endfilename %}
+
+ $ pip3.6 install --user pythonanywhere
+
+
+Това трябва да отпечата някои неща като `Collecting pythonanywhere` и в крайна сметка да завърши с ред, който казва `Successfully installed (...) pythonanywhere- (...)`.
+
+Сега стартираме помощника за автоматично конфигуриране на приложението ви от GitHub. Въведете следното в конзолата на PythonAnywhere (не забравяйте да използвате потребителското си име на GitHub вместо ``, така че URL адресът да съответства на клонираният URL от GitHub):
+
+{% filename %}PythonAnywhere command-line{% endfilename %}
+
+ $ pa_autoconfigure_django.py --python=3.6 https://github.com//my-first-blog.git
+
+
+Докато гледате това да работи, ще можете да видите какво прави:
+
+- Изтегляне на вашия код от GitHub
+- Създаване на virtualenv на PythonAnywhere, точно като този на вашия собствен компютър
+- Актуализиране на вашия файл с настройки с някои настройки за внедряване
+- Настройка на база данни на PythonAnywhere с помощта на командата `manage.py migrate`
+- Настройка на статичните ви файлове (за тях ще научим по-късно)
+- И конфигуриране на PythonAnywhere да обслужва вашето уеб приложение чрез неговия API
+
+На PythonAnywhere всички тези стъпки са автоматизирани, но те са същите стъпки, които би трябвало да преминете с всеки друг доставчик на сървъри.
+
+Основното, което трябва да забележите в момента, е, че вашата база данни в PythonAnywhere всъщност е напълно отделена от вашата база данни на вашия собствен компютър, така че може да има различни публикации и администраторски акаунти. В резултат на това, точно както направихме на вашия собствен компютър, трябва да инициализираме администраторския акаунт с `createsuperuser`. PythonAnywhere автоматично активира вашия virtualenv за вас, така че всичко, което трябва да направите, е да стартирате:
+
+{% filename %}PythonAnywhere command-line{% endfilename %}
+
+ (ola.pythonanywhere.com) $ python manage.py createsuperuser
+
+
+Въведете данните за вашия администратор потребител. Най-добре е да използвате същите, които използвате на собствения си компютър, за да избегнете объркване, освен ако не искате да направите паролата на PythonAnywhere по-сигурна.
+
+Сега, ако желаете, можете също да разгледате кода си на PythonAnywhere, като използвате `ls`:
+
+{% filename %}PythonAnywhere command-line{% endfilename %}
+
+ (ola.pythonanywhere.com) $ ls
+ blog db.sqlite3 manage.py mysite requirements.txt static
+ (ola.pythonanywhere.com) $ ls blog/
+ __init__.py __pycache__ admin.py apps.py migrations models.py
+ tests.py views.py
+
+
+Можете също да отидете на страницата „Файлове“ и да се придвижвате наоколо, използвайки вградения файлов браузър на PythonAnywhere. (От страницата на конзолата можете да стигнете до други страници на PythonAnywhere от бутона на менюто в горния десен ъгъл. След като сте на една от страниците, има връзки към другите в горната част.)
+
+## Вече сте на живо!
+
+Сега вашият сайт трябва да бъде на живо в публичния Интернет! Кликнете върху страницата „Уеб“ на PythonAnywhere, за да получите линк към нея. Можете да споделите това с всеки, който искате :)
+
+> **Забележка** Това е урок за начинаещи и при разгръщането на този сайт взехме няколко преки пътища, които не са идеални от гледна точка на сигурността. Ако и когато решите да надградите този проект или да започнете нов проект, трябва да прегледате [контролния списък за разгръщане на Django](https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/) за някои съвети относно осигуряването на вашия сайт.
+
+## Съвети за отстраняване на грешки
+
+Ако видите грешка при изпълнение на скрипта `pa_autoconfigure_django.py`, ето няколко често срещани причини:
+
+- Забравяйки да създадете своя маркер за API на PythonAnywhere API.
+- Грешка в URL адреса ви в GitHub
+- Ако видите грешка, която казва *"Could not find your settings.py"*, вероятно защото не успяхте да добавите всичките си файлове в Git и/или не ги избутахте до GitHub успешно. Погледнете още един път раздела Git по-горе
+- Ако преди това сте се регистрирали за акаунт в PythonAnywhere и имате грешка с collectstatic, вероятно имате по-стара версия на SQLite (например 3.8.2) за вашия акаунт. В такъв случай се регистрирайте за нов акаунт и опитайте командите в секцията PythonAnywhere по-горе.
+
+Ако видите грешка, когато се опитвате да посетите вашия сайт, първото място за търсене на информация за отстраняване на грешки е във вашия **error log**. Ще намерите линк към това на страницата на PythonAnywhere ["Web"](https://www.pythonanywhere.com/web_app_setup/). Вижте дали има съобщения за грешки там; най-новите са най-отдолу.
+
+Също така има някои [общи съвети за отстраняване на грешки на помощния сайт на PythonAnywhere](http://help.pythonanywhere.com/pages/DebuggingImportError).
+
+И не забравяйте, че вашият ментор е тук, за да ви помогне!
+
+# Вижте вашия сайт!
+
+Страницата по подразбиране за вашия сайт трябва да гласи „It worked!“, точно както прави на вашия локален компютър. Опитайте да добавите `/admin/` в края на URL адреса и ще бъдете отведени до администраторския сайт. Влезте с потребителското име и паролата и ще видите, че можете да добавяте нови публикации на сървъра - не забравяйте, че публикациите от вашата локална база данни за тестове не бяха изпратени във вашия блог на живо.
+
+След като създадете няколко публикации, можете да се върнете към вашата локална настройка (не PythonAnywhere). От тук трябва да работите върху вашата локална настройка, за да направите промени. Това е често срещан работен процес в уеб разработката - правете промени локално, бутате тези промени в GitHub и изтегляте промените надолу към вашия уеб сървър на живо. Това ви позволява да работите и да експериментирате, без да нарушавате уеб сайта си на живо. Доста готино, а?
+
+Заслужавате *огромни* похвали! Сървърните внедрения са едни от най-трудните части на уеб разработката и често отнемат на хората няколко дни, преди да ги накарат да работят. Но вие имате своя сайт на живо, в реалния Интернет!
\ No newline at end of file
diff --git a/bg/deploy/images/github_get_repo_url_screenshot.png b/bg/deploy/images/github_get_repo_url_screenshot.png
new file mode 100644
index 00000000000..ee1560b1e85
Binary files /dev/null and b/bg/deploy/images/github_get_repo_url_screenshot.png differ
diff --git a/bg/deploy/images/new_github_repo.png b/bg/deploy/images/new_github_repo.png
new file mode 100644
index 00000000000..d1f82e5d863
Binary files /dev/null and b/bg/deploy/images/new_github_repo.png differ
diff --git a/bg/deploy/images/pythonanywhere_account.png b/bg/deploy/images/pythonanywhere_account.png
new file mode 100644
index 00000000000..612d4528e11
Binary files /dev/null and b/bg/deploy/images/pythonanywhere_account.png differ
diff --git a/bg/deploy/images/pythonanywhere_bash_console.png b/bg/deploy/images/pythonanywhere_bash_console.png
new file mode 100644
index 00000000000..68eb2a030e1
Binary files /dev/null and b/bg/deploy/images/pythonanywhere_bash_console.png differ
diff --git a/bg/deploy/images/pythonanywhere_beginner_account_button.png b/bg/deploy/images/pythonanywhere_beginner_account_button.png
new file mode 100644
index 00000000000..c1be0a14132
Binary files /dev/null and b/bg/deploy/images/pythonanywhere_beginner_account_button.png differ
diff --git a/bg/deploy/images/pythonanywhere_create_api_token.png b/bg/deploy/images/pythonanywhere_create_api_token.png
new file mode 100644
index 00000000000..abae45ae37a
Binary files /dev/null and b/bg/deploy/images/pythonanywhere_create_api_token.png differ
diff --git a/bg/deploy/install_git.md b/bg/deploy/install_git.md
new file mode 100644
index 00000000000..4ea1d93e174
--- /dev/null
+++ b/bg/deploy/install_git.md
@@ -0,0 +1,52 @@
+Git е "система за контрол на версиите", използвана от много програмисти. Този софтуер може да проследява промените във файловете с течение на времето, така че да можете да заредите конкретни версии по-късно. Нещо като функцията „проследяване на промените“ в програми за текстообработка (например, Microsoft Word или LibreOffice Writer), но много по-мощна.
+
+## Инсталиране на Git
+
+
+
+Можете да свалите Git от [git-scm.com](https://git-scm.com/). Можете да натиснете „ next“ на всички стъпки, с изключение на две: в стъпката, където се изисква да изберете вашия редактор, трябва да изберете Nano, и в стъпката, озаглавена „Настройка на вашата PATH среда“, изберете „Използване на Git и незадължителни инструменти на Unix от командния ред на Windows " (най-долната опция). Освен това, настройките по подразбиране са добре. Разгледайте Windows стил, Unix стил за окончанията на редовете е добре.
+
+Не забравяйте да рестартирате командния ред или PowerShell, след като инсталацията приключи успешно.
+
+
+
+Свалете Git от [git-scm.com](https://git-scm.com/) и следвайте инструкцията.
+
+> **Забележка** Ако използвате OS X 10.6, 10.7 или 10.8, ще трябва да инсталирате версията на git от тук: [Инсталатор на Git за OS X Snow Leopard](https://sourceforge.net/projects/git-osx-installer/files/git-2.3.5-intel-universal-snow-leopard.dmg/download)
+
+
+
+
+
+{% filename %}command-line{% endfilename %}
+
+```bash
+$ sudo apt install git
+```
+
+
+
+
+
+{% filename %}command-line{% endfilename %}
+
+```bash
+$ sudo dnf install git
+```
+
+
+
+
+
+{% filename %}command-line{% endfilename %}
+
+```bash
+$ sudo zypper install git
+```
+
+
\ No newline at end of file
diff --git a/bg/deploy/signup_pythonanywhere.md b/bg/deploy/signup_pythonanywhere.md
new file mode 100644
index 00000000000..007eba2cfe2
--- /dev/null
+++ b/bg/deploy/signup_pythonanywhere.md
@@ -0,0 +1,19 @@
+PythonAnywhere е услуга за ползване на Python код на сървъри „в облака“. Ще използваме нея за хостинг на нашия сайт, на живо и в интернет.
+
+Ще направим блог, който изграждаме на PythonAnywhere. Регистрирайте се за акаунт за начинаещи в PythonAnywhere (безплатното ниво е добре, нямате нужда от кредитна карта).
+
+* [www.pythonanywhere.com](https://www.pythonanywhere.com/)
+
+
+
+> **Забележка** Когато избирате вашето потребителско име тук, имайте предвид, че URL адресът на вашия блог ще приеме формата `yourusername.pythonanywhere.com`, така че изберете свой собствен прякор или име на блога. Също така, запомнете вашата парола (добавете я към вашия мениджър на пароли, ако използвате такъв).
+
+## Създаване на PythonAnywhere API токен
+
+Това е нещо, което трябва да направите само веднъж. Когато се регистрирате за PythonAnywhere, ще бъдете отведени до таблото си за управление. Намерете линка в горния десен ъгъл до страницата си „ Account“:
+
+
+
+след това изберете раздела, наречен "API token", и натиснете бутона с надпис "Create new API token".
+
+
\ No newline at end of file
diff --git a/bg/django/README.md b/bg/django/README.md
new file mode 100644
index 00000000000..b6f4ebe0064
--- /dev/null
+++ b/bg/django/README.md
@@ -0,0 +1,27 @@
+# Какво е Django?
+
+Django (/ ˈdʒæŋɡoʊ / *jang-goh*) е безплатна и отворена уеб рамка, написана на Python. Уеб рамката е набор от компоненти, които ви помагат да развивате уеб сайтове по-бързо и по-лесно.
+
+Когато създавате уебсайт, винаги се нуждаете от подобен набор от компоненти: начин за справяне с удостоверяването на потребителя (регистрация, влизане, излизане), панел за управление на вашия уебсайт, формуляри, начин за качване на файлове и т. н.
+
+За ваше щастие, други хора отдавна забелязаха, че уеб разработчиците са изправени пред подобни проблеми при изграждането на нов сайт, така че те се обединиха и създадоха рамки (Django е една от тях), които ви дават готови компоненти за използване.
+
+Рамките съществуват за да ви спестяват нуждата да преоткривате колелото и да помогнат за облекчаване на част от разходи, когато създавате нов сайт.
+
+## Защо имате нужда от рамка?
+
+За да разберем за какво всъщност е Django, трябва да разгледаме по-отблизо сървърите. Първото нещо е, че сървърът трябва да знае, че искате той да ви обслужва уеб страница.
+
+Представете си пощенска кутия (порт), която се следи за входящи писма (заявки). Това се прави от уеб сървър. Уеб сървърът чете писмото и след това изпраща отговор с уеб страница. Но когато искате да изпратите нещо, трябва да имате някакво съдържание. А Django е нещо, което ви помага да създавате съдържанието.
+
+## Какво се случва, когато някой поиска уебсайт от вашия сървър?
+
+Когато заявката стигне до уеб сървър, тя се предава на Django, който се опитва да разбере какво всъщност се иска. Първо взема адреса на уеб страница и се опитва да разбере какво да прави. Тази част се прави от **urlresolver** на Django (обърнете внимание, че адресът на уебсайт се нарича URL - Uniform Resource Locator - така че името *urlresolver* има смисъл). Не е много умно - взема списък от модели и се опитва да съответства на URL адреса. Django проверява шаблоните отгоре надолу и ако нещо съвпада, Django предава заявката на свързаната функция (която се нарича *view*).
+
+Представете си пощенски превозвач с писмо. Тя върви по улицата и проверява всеки домашен номер спрямо този на писмото. Ако съвпада, тя поставя писмото там. Ето как работи urlresolver!
+
+Във функцията *view* се правят всички интересни неща: можем да разгледаме база данни, за да потърсим някаква информация. Може би потребителят иска да промени нещо в данните? Като писмо, в което се казва: „Моля, променете описанието на моята работа“. *view* може да провери дали ви е позволено да го направите, след това актуализира описанието на работата за вас и изпраща обратно съобщение: „Готово!“ Тогава *view* генерира отговор и Django може да го изпрати до уеб браузъра на потребителя.
+
+Описанието по-горе е малко опростено, но все още не е необходимо да знаете всички технически неща. Наличието на обща идея е достатъчно.
+
+Така че вместо да се гмурнем твърде много в детайли, ще започнем да създаваме нещо с Django и ще научим всички важни части по пътя!
\ No newline at end of file
diff --git a/bg/django_admin/README.md b/bg/django_admin/README.md
new file mode 100644
index 00000000000..205ab964b48
--- /dev/null
+++ b/bg/django_admin/README.md
@@ -0,0 +1,57 @@
+# Администратор на Django
+
+За добавяне, редактиране и изтриване на публикациите, които току-що моделирахме, ще използваме администратора на Django.
+
+Нека отворим файла `blog/admin.py` в редактора на кода и заменим съдържанието му с това:
+
+{% filename %}blog/admin.py{% endfilename %}
+
+```python
+from django.contrib import admin
+from .models import Post
+
+admin.site.register(Post)
+```
+
+Както можете да видите, ние импортираме (включваме) модела Post, дефиниран в предишната глава. За да направим модела ни видим на страницата на администратора, трябва да регистрираме модела с `admin.site.register(Post)`.
+
+Добре, време да разгледаме нашия модел Post. Не забравяйте да стартирате `python manage.py runserver` в конзолата, за да стартирате уеб сървъра. Отидете до вашия браузър и напишете адреса http://127.0.0.1:8000/admin/. Ще видите страница за вход като тази:
+
+
+
+За да влезете, трябва да създадете *superuser* - потребителски акаунт, който има контрол върху всичко в сайта. Върнете се в командния ред, напишете `python manage.py createsuperuser` и натиснете enter.
+
+> Не забравяйте, че за да пишете нови команди, докато уеб сървърът работи, отворете нов прозорец на терминала и активирайте своя virtualenv. Прегледахме как да пишете нови команди във **Вашия първи проект на Django!**, в секцията **Стартиране на уеб сървъра**.
+
+{% filename %}macOS or Linux:{% endfilename %}
+
+ (myvenv) ~/djangogirls$ python manage.py createsuperuser
+
+
+{% filename %}Windows:{% endfilename %}
+
+ (myvenv) C:\Users\Name\djangogirls> python manage.py createsuperuser
+
+
+Когато бъдете подканени, въведете потребителското си име (малки букви, без интервали), имейл адрес и парола. **Не се притеснявайте, че не можете да видите паролата, която въвеждате - така трябва да бъде.** Въведете я и натиснете `enter`, за да продължите. Резултатът трябва да изглежда така (където потребителското име и имейл трябва да са ваши собствени):
+
+ Username: ola
+ Email address: ola@example.com
+ Password:
+ Password (again):
+ Superuser created successfully.
+
+
+Върнете се в браузъра си. Влезте с избраните от вас име и парола на superuser; трябва да видите таблото за управление на Django.
+
+
+
+Отидете на постове и експериментирайте малко с тях. Добавете пет или шест публикации в блога. Не се притеснявайте за съдържанието - вижда се само на вашия локален компютър - можете да копирате и поставите някакъв текст от този урок, за да спестите време. :)
+
+Уверете се, че поне две или три публикации (но не всички) имат зададена дата на публикуване. По-късно ще бъде полезно.
+
+
+
+Ако искате да знаете повече за администратора на Django, трябва да проверите документацията на Django: https://docs.djangoproject.com/en/2.2/ref/contrib/admin/
+
+Това вероятно е подходящ момент да вземете кафе (или чай) или нещо за хапване, за да се "заредите". Създадохте първия си модел Django - заслужавате малка почивка!
\ No newline at end of file
diff --git a/bg/django_admin/images/django_admin3.png b/bg/django_admin/images/django_admin3.png
new file mode 100644
index 00000000000..fb221bd18e1
Binary files /dev/null and b/bg/django_admin/images/django_admin3.png differ
diff --git a/bg/django_admin/images/edit_post3.png b/bg/django_admin/images/edit_post3.png
new file mode 100644
index 00000000000..57299b6f5af
Binary files /dev/null and b/bg/django_admin/images/edit_post3.png differ
diff --git a/bg/django_admin/images/login_page2.png b/bg/django_admin/images/login_page2.png
new file mode 100644
index 00000000000..c16d1aa4289
Binary files /dev/null and b/bg/django_admin/images/login_page2.png differ
diff --git a/bg/django_forms/README.md b/bg/django_forms/README.md
new file mode 100644
index 00000000000..eca45d6389a
--- /dev/null
+++ b/bg/django_forms/README.md
@@ -0,0 +1,452 @@
+# Django форми
+
+Последното нещо, което искаме да направим в нашия уеб сайт е да създадем начин за добавяне и редактиране на публикации в блога. Django администратора е супер, но е по-трудно да се персонализира и направи приятно на външен вид. С формите ще имаме абсолютно надмощие над нашия изглед - можем да правим почти всичко което може да си представим!
+
+Хубавото на Django формите е, че може да дефинираме форма от самото начало или да създадем ModelForm, в която ще съхраняваме резултатът от формата на модела.
+
+Точно това искаме да направим: ще създадем форма за нашия `Post` модел.
+
+Като всяка важна част от Django, формите също имат собствен файл: `forms.py`.
+
+Трябва да създадем файл с това наименование в директорията на `blog`.
+
+ blog
+ └── forms.py
+
+
+И така, нека да отворим IDE и напишем следният код:
+
+{% filename %}blog/forms.py{% endfilename %}
+
+```python
+from django import forms
+
+from .models import Post
+
+class PostForm(forms.ModelForm):
+
+ class Meta:
+ model = Post
+ fields = ('title', 'text',)
+```
+
+Първо трябва да въведем Django формите (`from django import forms`) и нашия `Post` модел (`from .models import Post`).
+
+`PostForm`, както забелязахте е името на нашата форма. Трябва да кажем на Django, че тази форма е `ModelForm` (така че Django да направи малко магия за нас) - `forms.ModelForm` отговаря за това.
+
+След това с `class Meta`, казваме на Django кой модел трябва да се използва за да се създаде тази форма (`model = Post`).
+
+Най-накрая трябва да кажем с какви полета ще разполагаме в нашата форма. При този сценарий искаме само title и text да бъдат показани – author ще бъде този, който в момента е влязъл с профила си (ти!) и created_date трябва автоматично да се създаде, когато започнем нова публикация (като в кода), нали?
+
+И това е! Всичко от което имаме нужда в момента е да използваме формата във изгледа и да я покажем в шаблона.
+
+И така още веднъж, ще създадем връзка до страницата чрез URL, view и template.
+
+## Връзка до страницата чрез формата
+
+Време е да отворим `blog/templates/blog/base.html` в редактора. В `div` наречен `page-header` ще добавим връзка:
+
+{% filename %}blog/templates/blog/base.html{% endfilename %}
+
+```html
+
+```
+
+Забележете, че искаме да извикаме нашия нов изглед `post_new`. Класът `"glyphicon glyphicon-plus"` е предоставен от темата на bootstrap, която използваме и ще покаже знака плюс.
+
+След добаване на този ред, вашия HTML файл трябва да изглежда ето така:
+
+{% filename %}blog/templates/blog/base.html{% endfilename %}
+
+```html
+{% load static %}
+
+
+ Django Girls blog
+
+
+
+
+
+
+
+
+
+
+```
+
+След запазване и обновяване на страницата http://127.0.0.1:8000 трябва да виждате познатата грешка `NoReverseMatch`. Така ли е? Добре!
+
+## URL
+
+Отваряме файла `blog/urls.py` в редактора и добавяме ред:
+
+{% filename %}blog/urls.py{% endfilename %}
+
+```python
+path('post/new/', views.post_new, name='post_new'),
+```
+
+И последния код трябва да изглежда така:
+
+{% filename %}blog/urls.py{% endfilename %}
+
+```python
+from django.urls import path
+from . import views
+
+urlpatterns = [
+ path('', views.post_list, name='post_list'),
+ path('post//', views.post_detail, name='post_detail'),
+ path('post/new/', views.post_new, name='post_new'),
+]
+```
+
+След като обновим сайта виждаме `AttributeError`, тъй като нямаме изглед за изпълнението на `post_new`. Нека го добавим сега.
+
+## post_new изглед
+
+Време е да отворим файлът `blog/views.py` в редактора и да добавим следните няколко реда от код при останалите във формата
+
+{% filename %}blog/views.py{% endfilename %}
+
+```python
+from .forms import PostForm
+```
+
+И след това нашия изглед:
+
+{% filename %}blog/views.py{% endfilename %}
+
+```python
+def post_new(request):
+ form = PostForm()
+ return render(request, 'blog/post_edit.html', {'form': form})
+```
+
+За да създадем нова форма `Post`, трябва да извикаме `PostForm()` и да я препратим към шаблона (template). Ще се върнем отново на този изглед (view), но сега нека бързо да създадем шаблон (template) за формата.
+
+## Шаблон (Template)
+
+Трябва да създадем файл `post_edit.html` в директория `blog/templates/blog` и да го отворим в редактора ни за код. За да направим така, че формата да работи са ни нужни няколко неща:
+
+* Трябва да покажем формата. Можем да направим това чрез (например) {% raw %}`{{ form.as_p }}`{% endraw %}.
+* Горният ред трябва да бъде обвит с HTML form tag: ``.
+* Трябва ни бутон `Save`. Това правим с HTML button: ``.
+* И най-накрая, точно след отварящия `
+{% endblock %}
+```
+
+Време е да обновим страницата! Иха! Формата се показа!
+
+
+
+Но, чакай малко! Когато напишеш нещо в полетата `title` и `text` и се опиташ да го запазиш, какво ще стане?
+
+Нищо! Пак сме на същата страница и нашият текст изчезна... и няма нова публикация. Какво се обърка?
+
+Отговорът е: нищо. Трябва още малко да поработим върху нашия изглед (*view*).
+
+## Запазване на формата
+
+Отворете пак `blog/views.py` в редактора. В момента всичко, което имаме в изгледа на `post_new` е следното:
+
+{% filename %}blog/views.py{% endfilename %}
+
+```python
+def post_new(request):
+ form = PostForm()
+ return render(request, 'blog/post_edit.html', {'form': form})
+```
+
+Когато изпратим форматата се връщаме пак на същият изглед, но този път имаме повече данни в запитването (`request`) или по-точно в `request.POST` (наименованието няма нищо общо с блога "post", а с факта, че "публикуваме" информация). Помните ли как в нашия HTML файл при дефинирането на `
+
+
Ако сега се опитате да посетите 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 %} Искаме да имаме връзка от заглавието на поста в листа с публикациите до страницата със съдържанието на поста. Нека променим `
`, така че да се свързва със съдържанието на страницата:{% endraw %}
+
+{% filename %}{{ warning_icon }} blog/templates/blog/post_list.html{% endfilename %}
+
+```html
+
+```
+
+{% 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//', views.post_detail, name='post_detail'),`, така че файлът да изглежда по този начин:
+
+{% filename %}{{ warning_icon }} blog/urls.py{% endfilename %}
+
+```python
+from django.urls import path
+from . import views
+
+urlpatterns = [
+ path('', views.post_list, name='post_list'),
+ path('post//', views.post_detail, name='post_detail'),
+]
+```
+
+Тази част `post//` уточнява URL образеца -- ще ви го обясним:
+
+- `post/` означава, че URL трябва да започва с думата **post** последвана от **/**. Дотук добре.
+- `` -- тази част е по-сложна. Означава, че Django очаква стойност цяло число и ще го преведе към изгледа (view) като променлива наречена `pk`.
+- `/` – след това ни е необходима **/** преди да завършим URL.
+
+Това означава, че когато напишем в търсачката си `http://127.0.0.1:8000/post/5/`, Django ще разбере, че търсите за *view* наречен `post_detail` и изпраща информацията, че този `pk` съответства на `5` спрямо този *view* (изглед).
+
+И така, добавихме нов URL образец към `blog/urls.py`! Нека презаредим страницата: http://127.0.0.1:8000/ Бум! Сървърът отново спря да работи. Погледнете в конзолата -- както се очакваше, има нова грешка!
+
+
+
+Помните ли каква е следващата стъпка? Добавяне на нов изглед (view)!
+
+## Добавяне на изглед за съдържанието на поста
+
+Този път на нашето *view* даваме допълнителен параметър, `pk`. Нашето *view* трябва да го прихване, нали? Така, ще дефинираме нашата функция като `def post_detail(request, pk):`. Забележете, че този параметър трябва да има точно същото име като на `urls` (`pk`), който уточнихме по-рано. Също така забележете, че пропускането на тази променлива е неправилно и в резултат ще доведе до грешка!
+
+Сега, искаме да вземем само и единствено една публикация. За да направим това, можем да използваме querysets ето така:
+
+{% filename %}{{ warning_icon }} blog/views.py{% endfilename %}
+
+```python
+Post.objects.get(pk=pk)
+```
+
+Но този код има проблем. Ако нямаме `Post` с даден `primary key` (`pk`) ще имаме много грозна грешка!
+
+
+
+Ние не искаме това! За щастие Django идва с нещо, с което да се справи вместо нас: `get_object_or_404`. В случай, че няма `Post` със зададен `pk`, ще се покаже на екрана много по-добре, `Page Not Found 404` страница.
+
+
+
+Хубавото е, че всъщност и вие можете да си създадете такава страница `Page not found` и да я направите колкото си искате хубава. Но не е чак толкова важно в момента, затова ще го пропуснем.
+
+ОК, време е да добавим *view* към нашия файл `views.py`!
+
+В 0>blog/urls.py създадохме 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 %}
+
+ {% if post.published_date %}
+
+ {{ post.published_date }}
+
+ {% endif %}
+
{{ post.title }}
+
{{ post.text|linebreaksbr }}
+
+{% endblock %}
+```
+
+Още веднъж удължаваме `base.html`. В блока `content` искаме да покажем датата на публикуване на поста (ако същестрвува), заглавието и текста. Но трябва да обсъдим други важни работи, нали?
+
+{% raw %}`{% if ... %} ... {% endif %}` е шаблонен етикет, който използваме, когато искаме да проверим нещо. (Помните ли `if ... else ...` от главата ** Въведение в Python**?) В този случай искаме да проверим дали `published_date` (датата на публикване) на поста не е празна.{% endraw %}
+
+ОК, можем да отворим страницата ни наново и ще видим, че `TemplateDoesNotExist` сега го няма.
+
+
+
+Ихаа! Работи!
+
+# Време за прехвърляне на файловете!
+
+Би било добре да видите дали сайта ви работи на PythonAnywhere нали? Нека опитаме да прехвърлим всичко отново.
+
+{% filename %}command-line{% endfilename %}
+
+ $ git status
+ $ git add --all .
+ $ git status
+ $ git commit -m "Added view and template for detailed blog post as well as CSS for the site."
+ $ git push
+
+
+Тогава, в [PythonAnywhere Bash конзолата](https://www.pythonanywhere.com/consoles/):
+
+{% filename %}PythonAnywhere command-line{% endfilename %}
+
+ $ cd ~/.pythonanywhere.com
+ $ git pull
+ [...]
+
+
+(Не забравяйте да замените `` с вашият актуален PythonAnywhere субдомейн, без скобите.)
+
+## Обновяване на статичните файлове на сървърът:
+
+Сървъри като PythonAnywhere обичат да се отнасят към "статичните файлове" (като CSS файлове) различно от Python файловете, защото те могат да оптимизират зареждането им по-бързо. В резултат, когато правим промени на нашите CSS файлове трябва да напишем допълнителни команди на сървъра за да му кажем да ги обнови. Командата се казва `collectstatic`.
+
+Започнете като активирате виртуалната си среда, ако не е активна от преди това (PythonAnywhere използва команда наречена `workon` да направи това, същото е както когато използваме команда `source myenv/bin/activate` на своя компютър.
+
+{% filename %}PythonAnywhere command-line{% endfilename %}
+
+ $ workon .pythonanywhere.com
+ (ola.pythonanywhere.com)$ python manage.py collectstatic
+ [...]
+
+
+Командата `manage.py collectstatic` е нещо като `manage.py migrate`. Правим промени на кода си, след това казваме на Django да приложи тези промени или към събраните статизни файлове на сървъра или към базата данни.
+
+Във всеки случай сега сме готови да отидем на ["Web" страницата](https://www.pythonanywhere.com/web_app_setup/) (от бутона на менюто в горния десен ъгъл) и натиснем **Reload**, след това погледнете страницата https://subdomain.pythonanywhere.com за да видите резултата.
+
+Та това е! Поздравления :)
\ No newline at end of file
diff --git a/bg/extend_your_application/images/404_2.png b/bg/extend_your_application/images/404_2.png
new file mode 100644
index 00000000000..0a6fdf3234e
Binary files /dev/null and b/bg/extend_your_application/images/404_2.png differ
diff --git a/bg/extend_your_application/images/attribute_error2.png b/bg/extend_your_application/images/attribute_error2.png
new file mode 100644
index 00000000000..4b8262476d9
Binary files /dev/null and b/bg/extend_your_application/images/attribute_error2.png differ
diff --git a/bg/extend_your_application/images/does_not_exist2.png b/bg/extend_your_application/images/does_not_exist2.png
new file mode 100644
index 00000000000..e7015f2c80d
Binary files /dev/null and b/bg/extend_your_application/images/does_not_exist2.png differ
diff --git a/bg/extend_your_application/images/no_reverse_match2.png b/bg/extend_your_application/images/no_reverse_match2.png
new file mode 100644
index 00000000000..aba1c9c8980
Binary files /dev/null and b/bg/extend_your_application/images/no_reverse_match2.png differ
diff --git a/bg/extend_your_application/images/post_detail2.png b/bg/extend_your_application/images/post_detail2.png
new file mode 100644
index 00000000000..b40c92efb8c
Binary files /dev/null and b/bg/extend_your_application/images/post_detail2.png differ
diff --git a/bg/extend_your_application/images/post_list2.png b/bg/extend_your_application/images/post_list2.png
new file mode 100644
index 00000000000..dd0a0d67a6f
Binary files /dev/null and b/bg/extend_your_application/images/post_list2.png differ
diff --git a/bg/extend_your_application/images/template_does_not_exist2.png b/bg/extend_your_application/images/template_does_not_exist2.png
new file mode 100644
index 00000000000..c856abeda31
Binary files /dev/null and b/bg/extend_your_application/images/template_does_not_exist2.png differ
diff --git a/bg/how_the_internet_works/README.md b/bg/how_the_internet_works/README.md
new file mode 100644
index 00000000000..a1f0d1818bf
--- /dev/null
+++ b/bg/how_the_internet_works/README.md
@@ -0,0 +1,47 @@
+# Как работи интернет
+
+> За читателите у дома: тази глава е разгледана във видеото [Как работи интернет](https://www.youtube.com/watch?v=oM9yAA09wdc).
+>
+> Тази глава е вдъхновена от беседата "Как работи Интернет" от Джесика Маккелар (http://web.mit.edu/jesstess/www/).
+
+Обзалагаме се, че използвате интернет всеки ден. Но всъщност знаете ли какво се случва, когато въведете адрес като https://djangogirls.org в браузъра си и натиснете `enter`?
+
+Първото нещо, което трябва да разберете е, че уебсайтът се състои от куп файлове, записани на твърд диск - точно като вашите филми, музика или снимки. Има обаче една част, която е уникална за уебсайтовете: те включват компютърен код, наречен HTML.
+
+Ако не сте запознати с програмирането, в началото може да е трудно да разберете HTML, но вашите уеб браузъри (като Chrome, Safari, Firefox и др.) го харесват. Уеб браузърите са създадени да разбират този код, да следват неговите инструкции и да представят тези файлове, от които е направен уебсайтът ви, точно по начина, по който искате.
+
+Както при всеки файл, ние трябва да съхраняваме HTML файлове някъде на твърд диск. За интернет използваме специални, мощни компютри, наречени *сървъри*. Те нямат екран, мишка или клавиатура, защото основната им цел е да съхраняват данни и да ги предоставят. Ето защо те се наричат *сървъри* - защото те *предоставят* вашите данни.
+
+Добре, но искате да знаете как изглежда интернет, нали?
+
+Нарисувахме ви снимка! Изглежда така:
+
+
+
+Прилича на каша, нали? Всъщност това е мрежа от свързани машини (гореспоменатите *сървъри*). Стотици хиляди машини! Много, много километри кабели по света! Можете да посетите уебсайта на Submarine Cable Map (http://submarinecablemap.com), за да видите колко сложна е мрежата. Ето екранна снимка от уебсайта:
+
+
+
+Очарователно е, нали? Но не е възможно да има жица между всяка машина, свързана към Интернет. И така, за да достигнем машина (например тази, на която е записан https://djangogirls.org), трябва да предадем заявка през много, много различни машини.
+
+Изглежда така:
+
+
+
+Представете си, че когато въвеждате https://djangogirls.org, изпращате писмо, което гласи: "Скъпи момичета на Django, искам да видя уебсайта djangogirls.org. Изпратете ми го, моля!"
+
+Вашето писмо отива до най-близката до вас поща. След това преминава към друга, която е малко по-близо до вашия адресат, след това към друга и друга, докато не бъде доставено до местоназначението си. Единственото уникално нещо е, че ако изпратите много писма (*пакети данни*) на едно и също място, те могат да преминат през напълно различни пощенски станции (*рутери*). Това зависи от начина, по който се разпределят във всеки офис.
+
+
+
+Така става - изпращате съобщения и очаквате някакъв отговор. Вместо хартия и химикалка използвате байтове с данни, но идеята е същата!
+
+Вместо адреси с име на улица, град, пощенски код и име на държавата, използваме IP адреси. Вашият компютър първо пита DNS (система за имена на домейни) да преведе djangogirls.org в IP адрес. Тя работи малко като старомодни телефонни книжки, където можете да потърсите името на човека, с когото искате да се свържете, и да намерите техния телефонен номер и адрес.
+
+Когато изпращате писмо, то трябва да има определени функции, за да бъде доставено правилно: адрес, печат и т.н. Използвате и език, който приемникът разбира, нали? Същото се отнася и за *пакетите данни*, които изпращате, за да видите уебсайт. Ние използваме протокол, наречен HTTP (Hypertext Transfer Protocol).
+
+Така че, когато имате уебсайт, трябва да имате *сървър* (машина), където живее. Когато *сървърът* получи входяща *заявка* (с писмо), той изпраща обратно вашия уебсайт (с друго писмо).
+
+Тъй като това е урок за Django, може да попитате какво прави Django. Когато изпращате отговор, не винаги искате да изпращате едно и също нещо на всички. Много по-добре е, ако вашите писма са персонализирани, особено за човека, който току-що ви е писал, нали? Django ви помага при създаването на тези персонализирани, интересни писма. :)
+
+Достатъчно беседа - време за създаване!
\ No newline at end of file
diff --git a/bg/how_the_internet_works/images/internet_1.png b/bg/how_the_internet_works/images/internet_1.png
new file mode 100644
index 00000000000..e289eac2b23
Binary files /dev/null and b/bg/how_the_internet_works/images/internet_1.png differ
diff --git a/bg/how_the_internet_works/images/internet_2.png b/bg/how_the_internet_works/images/internet_2.png
new file mode 100644
index 00000000000..e8cf8b77999
Binary files /dev/null and b/bg/how_the_internet_works/images/internet_2.png differ
diff --git a/bg/how_the_internet_works/images/internet_3.png b/bg/how_the_internet_works/images/internet_3.png
new file mode 100644
index 00000000000..6f5d95dec80
Binary files /dev/null and b/bg/how_the_internet_works/images/internet_3.png differ
diff --git a/bg/how_the_internet_works/images/internet_4.png b/bg/how_the_internet_works/images/internet_4.png
new file mode 100644
index 00000000000..d4748ac48ef
Binary files /dev/null and b/bg/how_the_internet_works/images/internet_4.png differ
diff --git a/bg/html/README.md b/bg/html/README.md
new file mode 100644
index 00000000000..3f3a61de3dc
--- /dev/null
+++ b/bg/html/README.md
@@ -0,0 +1,217 @@
+# Въвeдение в HTML
+
+Може би се питате какво е шаблон (template)?
+
+Шаблонът е файл който, можем да използваме неколкократно за да представим различна информация в последователен формат -- например, можете да използвате шаблон, който да ви помага да напишете писмо, защото макар че всяко писмо да може да съдържа различно съобщение и да бъде адресирано до различен човек, те ще споделят същия формат.
+
+Django формат шаблона е описан в език наречен HTML (Това е HTML, който споменахме в главата **Как работи Internet**).
+
+## Какво е HTML?
+
+HTML е код, който се интерпретира от търсачките -- като Chrome, Firefox, Safari -- за да покаже на екран страницата на потребителя.
+
+HTML идва от "HyperText Markup Language". **HyperText** означава, че е тип от текст който подпомага хипервръзки между страници. **Markup** означава, че сме взели документа и сме го означили с код за да кажем нещо (в този случай, търсачка) как да подразбира страницата. HTML кода е изграден от **tags** (етикети), всеки от които стартира с `<` и завършва с `>`. Тези етикети представляват маркирани елементи (**elements**).
+
+## Първият ви шаблон!
+
+Създаване на шаблон означава създаване на шаблонен файл. Всичко е файл, нали? Може би вече забелязахте това.
+
+Шаблоните се запазват в директория `blog/templates/blog`. Така че, първо създайте директория наречена `templates` в директорията на блога ви. След това създайте друга директория наречена `blog` вътре при вашите шаблони:
+
+ blog
+ └───templates
+ └───blog
+
+
+(Може би се чудите защо са ни нужни две директории наречени `blog` -- както ще откриете по-късно, това е много лесно установена практика, която прави живота ни по-лесен, когато нещата започват да стават по-сложни.)
+
+И сега създайте файл `post_list.html` (оставете го празен засега) в директорията `blog/templates/blog`.
+
+Вижте как изглежда сайта ви: http://127.0.0.1:8000/
+
+> Ако все още имате грешка `TemplateDoesNotExist`, опитайте се да заредите сървъра си отново. Отидете в конзолата си, спрете сървъра като натиснете едновременно Ctrl+C и го стартирате отново като напишете команда `python manage.py runserver` .
+
+
+
+Вече нямаме грешка! Поздравления :) Въпреки това, сайта ви всъщност не публикува нищо освен празна страница, защото шаблонът ви също е празен. Можем да оправим това.
+
+Отворете новият файл в редактора и добавете следното:
+
+{% filename %}blog/templates/blog/post_list.html{% endfilename %}
+
+```html
+
+
+
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
+
+
+ Ola's blog
+
+
+
Hi there!
+
It works!
+
+
+```
+
+Запазете файла и презаредете страницата.
+
+
+
+Забелязахте ли как търсачката ви разбра, че заглавието на блога е "Ola's blog"? Тълкува `Ola's blog` и показва текст с името на заглавието в лентата на търсачката (също така ще се използва за отметка (bookmarks) и т.н.).
+
+Вероятно забелязахте и, че отварящия етикет съвпада със затварящия с `/`, като тези елементи са вложени (например не можете да затворите определен етикет, докато не затворите всички, които са преди него).
+
+Също като да слагаме неща в кутии. Имате една голяма кутия, ``; в нея е `` и това съдържа други по-малки кутии: ``.
+
+Трябва да следвате тези правила със затварящите етикети и вложените елементи - ако ли не, търсачката ви може и да не ги представи както трябва и страницата ви ще изглежда неправилно.
+
+## Персонализиране на шаблон
+
+Може малко да се позабавлявате и да опитате да направите свой шаблон! Ето няколко полезни етикета за целта:
+
+* `
Заглавие
` за най-важното ви заглавие
+* `
Подзаглавие
` за заглавие от следващо ниво
+* `
Под-подзаглавие
` …и т.н. до `
`
+* `
Абзац
`
+* `текст` набляга на текста
+* `текст` удебелява текста
+* ` ` отива на нов ред (не може да сложите нищо в br, както и няма затварящ етикет )
+* `връзка` създава връзка
+* `
първи елемент
втори елемент
` прави лист, точно като този!
+* `` дефинира секция от страницата
+
+Ето пример на пълен шаблон, копирайте и пренесете в `blog/templates/blog/post_list.html`:
+
+{% filename %}blog/templates/blog/post_list.html{% endfilename %}
+
+```html
+
+
+ Django Girls blog
+
+
+
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.
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.
+
+
+
+```
+
+Създадохме три `div` секции тук.
+
+* Първият `div` елемент съдържа името на блога -- неговото заглавие и връзката
+* Другите два `div` елемента съдържат нашите блог постове с датата на публикуване, `h2` със заглавието, на което може да се кликне и два `p`-елемента (абзаца) от текст, единия за датата, а другия за нашия пост.
+
+Дава ни този ефект:
+
+
+
+Ихаа! Но дотук, нашият шаблон показва точно **същата информация** -- там където говорихме по-рано за шаблоните, които ни позволяват да показваме **различна** информация в **същия формат**.
+
+Това, което искаме е да показва истински публикации добавени в администратора на Django -- и там е където отиваме след това.
+
+## Още нещо: прехвърляне на файловете (deploy)!
+
+Би било добре да видим всичко това на живо в Internet, нали? Нека направим още едно прехвърляне на файлове към PythonAnywhere:
+
+### Запазете, and избутайте кода си към GitHub
+
+Първо, нека видим кои файлове се промениха след последното прехвърляне (напишете следните команди на локалния компютър, не на PythonAnywhere):
+
+{% filename %}command-line{% endfilename %}
+
+ $ git status
+
+
+Бъдете сигурни, че сте в директорията на `djangogirls` и нека кажем на git да включи всички промени в тази директория:
+
+{% filename %}command-line{% endfilename %}
+
+ $ git add --all .
+
+
+> **Забележка** `--all` означава, че `git` ще разпознае и файлове, които сте изтрили (по подразбиране, разпознава нови/модифицирани файлове). Също помните (от 3-та глава), че `.` означава настоящата директория.
+
+Преди да качим всички файлове, нека проверим какво ще качи `git` (всички файлове, които `git` ще качи ще се появят в зелено):
+
+{% filename %}command-line{% endfilename %}
+
+ $ git status
+
+
+Почти сме там, сега е време да кажем да запази тези промени в хронологията си. Ще дадем съобщение за запазване ("commit message"), където описваме накратко какво сме променили. Може да напишете каквото си поискате на този етап, но е важно да се знае, че би трябвало да е нещо описващо от това, което сте направили, така че да се знае в бъдеще.
+
+{% filename %}command-line{% endfilename %}
+
+ $ git commit -m "Changed the HTML for the site."
+
+
+> **Забележка:** Бъдете сигурни, че сте сложили съобщението в двойни кавички.
+
+След като сме направили това, качваме (push) нашите промени на GitHub:
+
+{% filename %}command-line{% endfilename %}
+
+ $ git push
+
+
+### Издърпайте новия код на PythonAnywhere и презаредете страницата
+
+* Отворете [PythonAnywhere страницата](https://www.pythonanywhere.com/consoles/) и отидете на **Bash конзолата** (или стартирайте нова). След това напишете команда:
+
+{% filename %}PythonAnywhere command-line{% endfilename %}
+
+ $ cd ~/.pythonanywhere.com
+ $ git pull
+ [...]
+
+
+Трябва да заместите `` с актуалния си PythonAnywhere субдомейн без скобите. Вашият субдомейн е потребителско ви име в PythonAnywhere, но в някои случай може да е различно (като например ако потребителското ви име съдържа главни букви). Така че, ако тази команда не работи, използвайте команда `ls` (показване на лист от файлове) за да намерите вашия субдомейн/име на папката, и след това да отидете в нея `cd`.
+
+Сега гледайте как се сваля кода ви. Ако искате да проверите дали е пристигнал, отидете на **"Files" страница** и вижте кода си на PythonAnywhere (може да достигнете други страници на PythonAnywhere от бутона на менюто в страницата на конзолата).
+
+* Накрая, отидете на ["Web" страницата](https://www.pythonanywhere.com/web_app_setup/) и натиснете **Reload** на вашата апликация.
+
+Обновлението трябва да е на живо! Отидете и презаредете страницата си в търсачката. Промените трябва да са видими. :)
\ No newline at end of file
diff --git a/bg/html/images/step1.png b/bg/html/images/step1.png
new file mode 100644
index 00000000000..eb474aaeddd
Binary files /dev/null and b/bg/html/images/step1.png differ
diff --git a/bg/html/images/step3.png b/bg/html/images/step3.png
new file mode 100644
index 00000000000..47ede3f9993
Binary files /dev/null and b/bg/html/images/step3.png differ
diff --git a/bg/html/images/step4.png b/bg/html/images/step4.png
new file mode 100644
index 00000000000..0e6b48ec4a5
Binary files /dev/null and b/bg/html/images/step4.png differ
diff --git a/bg/html/images/step6.png b/bg/html/images/step6.png
new file mode 100644
index 00000000000..f044389de53
Binary files /dev/null and b/bg/html/images/step6.png differ
diff --git a/bg/images/application.png b/bg/images/application.png
new file mode 100644
index 00000000000..79071fe8d1b
Binary files /dev/null and b/bg/images/application.png differ
diff --git a/bg/installation/README.md b/bg/installation/README.md
new file mode 100644
index 00000000000..1976d4722a6
--- /dev/null
+++ b/bg/installation/README.md
@@ -0,0 +1,68 @@
+# Ако правите ръководството у дома
+
+Ако правите урока у дома, а не на някое от събитията на [Django Girls](https://djangogirls.org/events/), можете напълно да пропуснете тази глава сега и да отидете направо към главата [Как работи Интернет](../how_the_internet_works/README.md).
+
+Това е така, защото покриваме инсталирането на неща, каквито са необходими в урока - това е само допълнителна страница, която събира всички инструкции за инсталиране на едно място (което е полезно за някои формати на работилницата). Можете да изберете да инсталирате всичко, което е на тази страница в момента, ако желаете. Но ако искате да започнете да научавате неща, преди да инсталирате куп неща на вашия компютър, пропуснете тази глава и ние ще ви обясним по-късно инсталационните части, тъй като те са необходими.
+
+Късмет!
+
+# Ако посещавате уъркшоп
+
+Ако присъствате на някое от събитията на [Django Girls](https://djangogirls.org/events/):
+
+* Вашата работилница може да има "парти за инсталиране" преди основната работилница. Ако сте на парти за инсталиране, тази страница е за вас! Следвайте инструкциите тук, за да получите всичко необходимо за работния процес, с помощта на менторите, ако е необходимо. След това в основната работилница ще можете да пропуснете инструкциите за инсталиране, които ще срещнете в главния урок, когато стигнете до тях.
+* Организаторите на вашата работилница може би са ви помолили да опитате у дома, за да инсталирате всичко на вашия компютър, преди да започне уъркшопът. Ако сте били помолени да направите това, тази страница е за вас! Следвайте инструкциите тук, както можете най-добре. След това в основната работилница, когато стигнете до стъпка за инсталиране в основния урок, ако не сте успели да инсталирате тази част, можете да получите помощ от вашия ментор.
+* Ако вашият уъркшоп няма парти за инсталиране (или не можете да присъствате) и ако организаторите не са ви помолили да опитате да инсталирате всичко преди да сте пристигнали, пропуснете тази страница и отидете направо към главата [Как работи Интернет](../how_the_internet_works/README.md). Ще инсталирате всичко необходимо, докато работите през урока.
+
+# Инсталиране
+
+В този урок ще изграждате блог. За да направите това, докато преминавате през урока, ще бъдете инструктирани как да инсталирате различен софтуер на вашия компютър и да настроите някои онлайн акаунти, тъй като са необходими. Тази страница събира на едно място всички инструкции за инсталиране и регистрация (което е полезно за някои формати на работилницата).
+
+
+{% include "/chromebook_setup/instructions.md" %}
+
+
+# Кратко въведение в командния прозорец {#command-line}
+
+Много от стъпките по-долу се позовават на "конзолата", "терминала", "командния прозорец" или "командния ред" - всичко това означава едно и също нещо: прозорец на вашия компютър, в който можете да въведете команди. Когато стигнете до главния урок, ще научите повече за командния ред. Засега основното, което трябва да знаете, е как да отворите команден прозорец и как изглежда:
+{% include "/intro_to_command_line/open_instructions.md" %}
+
+# Инсталиране на Python {#python}
+
+{% include "/python_installation/instructions.md" %}
+
+# Инсталиране на редактор на код {#code-editor}
+
+{% include "/code_editor/instructions.md" %}
+
+# Настройте virtualenv и инсталирайте Django {#virtualenv}
+
+{% include "/django_installation/instructions.md" %}
+
+# Инсталиране на Git {#git}
+
+{% include "/deploy/install_git.md" %}
+
+# Създаване на акаунт в GitHub {#github}
+
+Отидете на [GitHub.com](https://www.github.com) и се регистрирайте за нов безплатен потребителски акаунт. Не забравяйте да запомните паролата си (добавете я към вашия мениджър на пароли, ако използвате такъв).
+
+# Създаване на акаунт в PythonAnywhere {#pythonanywhere}
+
+{% include "/deploy/signup_pythonanywhere.md" %}
+
+# Започнете да четете
+
+Поздравления, вече сте подготвени и готови да продължите! Ако все още имате известно време преди уъркшопа, би било полезно да започнете да четете няколко от началните глави:
+
+* [Как работи интернет](../how_the_internet_works/README.md)
+
+* [Въведение в командния ред](../intro_to_command_line/README.md)
+
+* [Въведение в Python](../python_introduction/README.md)
+
+* [Какво е Django?](../django/README.md)
+
+# Насладете се на уъркшопа!
+
+Когато започнете семинара, ще можете да преминете направо към [първия си проект на Django!](../django_start_project/README.md), защото вече сте обхванали материала в по-ранните глави.
diff --git a/bg/intro_to_command_line/README.md b/bg/intro_to_command_line/README.md
new file mode 100644
index 00000000000..d3883fa0b32
--- /dev/null
+++ b/bg/intro_to_command_line/README.md
@@ -0,0 +1,441 @@
+# Въведение в интерфейса на командния ред
+
+> За читателите у дома: тази глава е разгледана във видеото [Вашият нов приятел: Командният ред](https://www.youtube.com/watch?v=jvZLWhkzX-8).
+
+Вълнуващо е, нали ?! Ще напишете първия си ред код само за няколко минути! :)
+
+**Нека ви запознаем с първия ви нов приятел: командният ред!**
+
+Следващите стъпки ще ви покажат как да използвате черния прозорец, който използват всички хакери. В началото може да изглежда малко страшно, но всъщност тази подкана просто чака команди от вас.
+
+> **Забележка** Моля, имайте предвид, че в тази книга използваме взаимозаменяемите термини „директория“ и „папка“, но те са едно и също нещо.
+
+## Какво е командният ред?
+
+Прозорецът, който обикновено се нарича **команден ред** or **интерфеса на командния ред**, е текстово приложение за преглед, обработка и манипулиране на файлове на вашия компютър. Прилича много на Windows Explorer или Finder на Mac, но без графичния интерфейс. Други имена на командния ред са: *cmd*, *CLI*, * prompt *, * console * или * terminal *.
+
+## Отворете интерфейса на командния ред
+
+За да започнем някои експерименти, първо трябва да отворим интерфейса на командния ред.
+
+{% include "/intro_to_command_line/open_instructions.md" %}
+
+## Prompt
+
+Сега трябва да видите бял или черен прозорец, който чака вашите команди.
+
+
+
+Ако сте на Mac или Linux, вероятно виждате `$`, ето така:
+
+{% filename %}command-line{% endfilename %}
+
+ $
+
+
+
+
+
+
+На Windows, вероятно виждате `>`, ето така:
+
+{% filename %}command-line{% endfilename %}
+
+ >
+
+
+Погледнете раздела за Linux малко по-горе - ще видите нещо повече от това, когато стигнете до PythonAnywhere по-късно в урока.
+
+
+
+Всяка команда ще бъде предварително обозначена с `$` или `>` и един интервал, но не бива да го въвеждате. Вашият компютър ще го направи вместо вас. :)
+
+> Само малка забележка: във вашия случай може да има нещо като `C:\Users\ola>` или `Olas-MacBook-Air:~ ola$` преди знака на подкана и това е 100% ОК.
+
+Частта до и включително `$` или `>` се нарича *командния ред* или *подкана* за кратко. То ви подканва да въведете нещо там.
+
+В ръковдството, когато искаме да въведете команда, ще включим `$` или `>`, а понякога и повече вляво. Игнорирайте лявата част и въведете само командата, която започва след подкана.
+
+## Вашата първа команда (УРА!)
+
+Нека започнем с въвеждането на тази команда:
+
+
+
+{% filename %}command-line{% endfilename %}
+
+ $ whoami
+
+
+
+
+
+
+{% filename %}command-line{% endfilename %}
+
+ > whoami
+
+
+
+
+И след това натиснете `enter`. Това е нашият резултат:
+
+{% filename %}command-line{% endfilename %}
+
+ $ whoami
+ olasitarska
+
+
+Както можете да видите, компютърът току-що отпечата вашето потребителско име. Яко, а? :)
+
+> Опитайте да въведете всяка команда; не копирайте-поставете. Ще запомните повече по този начин!
+
+## Основи
+
+Всяка операционна система има малко по-различен набор от команди за командния ред, така че не забравяйте да следвате инструкциите за вашата операционна система. Нека опитаме това, става ли?
+
+### Текуща директория
+
+Би било хубаво да знаем къде сме сега, нали? Да видим. Въведете тази команда и натиснете `enter`:
+
+
+
+{% filename %}command-line{% endfilename %}
+
+ $ pwd
+ /Users/olasitarska
+
+
+> Забележка: 'pwd' означава 'print working directory' (принтиране работна директория).
+
+
+
+
+
+{% filename %}command-line{% endfilename %}
+
+ > cd
+ C:\Users\olasitarska
+
+
+> Забележка: 'cd' означава 'change directory' (промяна на директория). С PowerShell можете да използвате pwd точно както в Linux или macOS.
+
+
+
+Вероятно ще видите нещо подобно на вашата машина. След като отворите командния ред, обикновено стартирате в домашната директория на вашия потребител.
+
+* * *
+
+### Научете повече за команда
+
+Много команди, които можете да въведете в командния ред, имат вградена помощ, която можете да показвате и четете! Например, за да научите повече за текущата команда на директория:
+
+
+
+macOS и Linux имат команда `man`, която ви предоставя помощ за команди. Опитайте `man pwd` и вижте какво пише, или поставете `man` преди други команди, за да видите помощта им. Изходът на `man` обикновено се изписва на страницата. Използвайте интервала, за да преминете към следващата страница, и `q`, за да прекратите прегледа на помощта.
+
+
+
+
+
+Добавянето на `/?` суфикс към повечето команди ще отпечата помощната страница. Може да се наложи да превъртите прозореца на вашата команда нагоре, за да видите всичко. Опитайте `cd /?`.
+
+
+
+### Списък на файлове и директории
+
+И така, какво има в него? Ще е готино да разберем. Да видим:
+
+
+
+{% filename %}command-line{% endfilename %}
+
+ $ ls
+ Applications
+ Desktop
+ Downloads
+ Music
+ ...
+
+
+
+
+
+
+{% filename %}command-line{% endfilename %}
+
+ > dir
+ Directory of C:\Users\olasitarska
+ 05/08/2014 07:28 PM Applications
+ 05/08/2014 07:28 PM Desktop
+ 05/08/2014 07:28 PM Downloads
+ 05/08/2014 07:28 PM Music
+ ...
+
+
+> Забележка: В PowerShell можете също да използвате 'ls' като в Linux и macOS.
+
+* * *
+
+### Промяна на текущата директория
+
+Сега, нека да отидем на вашата директория Desktop:
+
+
+
+{% filename %}command-line{% endfilename %}
+
+ $ cd Desktop
+
+
+
+
+
+
+{% filename %}command-line{% endfilename %}
+
+ $ cd Desktop
+
+
+Отбележи, че името на директорията "Desktop" може да се преведе на езика на вашия Linux акаунт. В такъв случай ще трябва да замените ` Desktop ` с преведеното име; например, `Работен плот` за български език.
+
+
+
+
+
+{% filename %}command-line{% endfilename %}
+
+ > cd Desktop
+
+
+
+
+Проверете дали наистина е променена:
+
+
+
+{% filename %}command-line{% endfilename %}
+
+ $ pwd
+ /Users/olasitarska/Desktop
+
+
+
+
+
+
+{% filename %}command-line{% endfilename %}
+
+ > cd
+ C:\Users\olasitarska\Desktop
+
+
+
+
+Ето го!
+
+> PRO съвет: ако напишете `cd D` и след това натиснете `tab` на клавиатурата си, командният ред автоматично ще попълни останалото име, за да можете да навигирате по-бързо. Ако има повече от една папка, започваща с „D“, натиснете два пъти клавиша `tab`, за да получите списък с опции.
+
+* * *
+
+### Създаване на директория
+
+Какво ще кажете за създаването на тестова директория на вашия работен плот? Можете да го направите по този начин:
+
+
+
+{% filename %}command-line{% endfilename %}
+
+ $ mkdir practice
+
+
+
+
+
+
+{% filename %}command-line{% endfilename %}
+
+ > mkdir practice
+
+
+
+
+Тази малка команда ще създаде папка с името `practice` на вашия работен плот. Можете да проверите дали е там, като погледнете на работния си плот или като изпълните команда `ls` или `dir`! Опитайте. :)
+
+> PRO съвет: Ако не искате да въвеждате едни и същи команди отново и отново, опитайте да натиснете `стрелката нагоре` и `стрелка надолу` на клавиатурата си, за да преминете през последните използвани команди.
+
+* * *
+
+### Упражнение!
+
+Малко предизвикателство за вас: в новосъздадената си директория `practice` създайте директория, наречена `test`. (Използвайте командите `cd` и `mkdir`.)
+
+#### Решение:
+
+
+
+{% filename %}command-line{% endfilename %}
+
+ $ cd practice
+ $ mkdir test
+ $ ls
+ test
+
+
+
+
+
+
+{% filename %}command-line{% endfilename %}
+
+ > cd practice
+ > mkdir test
+ > dir
+ 05/08/2014 07:28 PM test
+
+
+
+
+Поздравления! :)
+
+* * *
+
+### Почистване
+
+Не искаме да оставим бъркотия, така че нека премахнем всичко, което направихме до този момент.
+
+Първо, трябва да се върнем към Desktop:
+
+
+
+{% filename %}command-line{% endfilename %}
+
+ $ cd ..
+
+
+
+
+
+
+{% filename %}command-line{% endfilename %}
+
+ > cd ..
+
+
+
+
+Използването на `..` с командата `cd` ще промени текущата ви директория на родителската директория (тоест директорията, която съдържа текущата ви директория).
+
+Проверете къде се намирате:
+
+
+
+{% filename %}command-line{% endfilename %}
+
+ $ pwd
+ /Users/olasitarska/Desktop
+
+
+
+
+
+
+{% filename %}command-line{% endfilename %}
+
+ > cd
+ C:\Users\olasitarska\Desktop
+
+
+
+
+Сега е време за изтриване на директорията `practice`:
+
+> **Внимание**: Изтриването на файлове с помощта на `del`, `rmdir` или `rm` е безвъзвратно, което означава, че *изтритите файлове ще изчезнат завинаги*! Затова бъдете много внимателни с тази команда.
+
+
+
+{% filename %}command-line{% endfilename %}
+
+ $ rm -r practice
+
+
+
+
+
+
+{% filename %}command-line{% endfilename %}
+
+ > rmdir /S practice
+ practice, Are you sure ? Y
+
+
+
+
+Готово! За да сме сигурни, че е действително изтрита, нека проверим:
+
+
+
+{% filename %}command-line{% endfilename %}
+
+ $ ls
+
+
+
+
+
+
+{% filename %}command-line{% endfilename %}
+
+ > dir
+
+
+
+
+### Изход
+
+Това е засега! Можете спокойно да затворите командния ред. Да го направим по хакерския начин, съгласни? :)
+
+
+
+{% filename %}command-line{% endfilename %}
+
+ $ exit
+
+
+
+
+
+
+{% filename %}command-line{% endfilename %}
+
+ > exit
+
+
+
+
+Готино, а? :)
+
+## Обобщение
+
+Ето обобщение на някои полезни команди:
+
+| Команда (Windows) | Команда (Mac OS / Linux) | Описание | Пример |
+| ----------------- | ------------------------ | -------------------------------- | --------------------------------------------------- |
+| exit | exit | затваряне на прозореца | **exit** |
+| cd | cd | промяна на директория | **cd test** |
+| cd | pwd | показване на текущата директория | **cd** (Windows) или **pwd** (Mac OS / Linux) |
+| dir | ls | списък директории / файлове | **dir** |
+| copy | cp | копие на файл | **copy c:\test\test.txt c:\windows\test.txt** |
+| move | mv | преместване на файл | **move c:\test\test.txt c:\windows\test.txt** |
+| mkdir | mkdir | създаване на нова директория | **mkdir testdirectory** |
+| rmdir (или del) | rm | изтриване на файл | **del c:\test\test.txt** |
+| rmdir /S | rm -r | изтриване на директория | **rm -r testdirectory** |
+| [CMD] /? | man [CMD] | получете помощ за команда | **cd /?** (Windows) или **man cd** (Mac OS / Linux) |
+
+Това са само малка част от командите, които можете да изпълнявате във вашия команден ред, но днес няма да използвате нищо повече от това.
+
+Ако ви е любопитно, [ss64.com](http://ss64.com) съдържа пълна справка с команди за всички операционни системи.
+
+## Готови?
+
+Нека се потопим в Python!
\ No newline at end of file
diff --git a/bg/intro_to_command_line/open_instructions.md b/bg/intro_to_command_line/open_instructions.md
new file mode 100644
index 00000000000..88c032d04dc
--- /dev/null
+++ b/bg/intro_to_command_line/open_instructions.md
@@ -0,0 +1,29 @@
+
+
+
+В зависимост от вашата версия на Windows и клавиатурата ви, едно от следните трябва да отвори команден прозорец (може да се наложи да експериментирате малко, но не е нужно да изпробвате всички тези предложения):
+
+- Отидете в менюто или екрана "Старт" и въведете "Команден ред" в полето за търсене.
+- Отидете в менюто "Старт" → Windows System → Команден ред.
+- Отидете в менюто Старт → Всички програми → Аксесоари → Команден ред.
+- Отидете на стартовия екран, задръжте мишката в долния ляв ъгъл на екрана и щракнете върху стрелката надолу, която се появява (на сензорен екран, вместо това натиснете нагоре от долната част на екрана). Страницата с приложения трябва да се отвори. Кликнете върху командния ред в секцията Windows.
+- Задръжте специалния клавиш Windows на клавиатурата си и натиснете клавиша "X". Изберете „Команден ред“ от изскачащото меню.
+- Задръжте клавиша на Windows и натиснете клавиша "R", за да получите прозорец "Изпълнение". Въведете "cmd" в полето и щракнете върху бутона OK.
+
+
+
+По-късно в този урок ще трябва да имате отворени два командни прозореца едновременно. Въпреки това, при някои версии на Windows, ако вече имате един отворен команден прозорец и се опитате да отворите втори, използвайки същия метод, той вместо това ще ви насочи към командния прозорец, който вече имате отворен. Опитайте го сега на вашия компютър и вижте какво ще се случи! Ако получите само един команден прозорец, опитайте някой от другите методи в списъка по-горе. Поне един от тях трябва да доведе до отваряне на нов команден прозорец.
+
+
+
+
+
+Отидете на Launchpad → Other → Terminal.
+
+
+
+
+
+Вероятно е под Applications → Accessories → Terminal или Applications → System → Terminal, но това може да зависи от вашата система. Ако не е там, можете да опитате да го потърсите в Google. :)
+
+
diff --git a/bg/python_installation/README.md b/bg/python_installation/README.md
new file mode 100644
index 00000000000..23ef41cb47f
--- /dev/null
+++ b/bg/python_installation/README.md
@@ -0,0 +1,15 @@
+# Да започнем с Python
+
+Най-накрая сме тук!
+
+Но първо нека ви разкажем какво е Python. Python е много популярен език за програмиране, който може да се използва за създаване на уебсайтове, игри, научен софтуер, графика и много, много други.
+
+Python възниква в края на 80-те години и основната му цел е да бъде четен от хора (не само от машини!). Ето защо той изглежда по-прост от другите езици за програмиране, но не се притеснявайте - Python също е наистина мощен!
+
+# Инсталиране на Python
+
+> **Забележка** Ако използвате Chromebook, пропуснете тази глава и се уверете, че следвате инструкциите [Настройка на Chromebook](../chromebook_setup/README.md).
+>
+> **Забележка** Ако вече сте минали през стъпките за инсталиране, не е нужно да правите това отново - можете да преминете направо към следващата глава!
+
+{% include "/python_installation/instructions.md" %}
\ No newline at end of file
diff --git a/bg/python_installation/images/add_python_to_windows_path.png b/bg/python_installation/images/add_python_to_windows_path.png
new file mode 100644
index 00000000000..3266efb6177
Binary files /dev/null and b/bg/python_installation/images/add_python_to_windows_path.png differ
diff --git a/bg/python_installation/images/python-installation-options.png b/bg/python_installation/images/python-installation-options.png
new file mode 100644
index 00000000000..a0a6c65d81d
Binary files /dev/null and b/bg/python_installation/images/python-installation-options.png differ
diff --git a/bg/python_installation/images/windows-plus-r.png b/bg/python_installation/images/windows-plus-r.png
new file mode 100644
index 00000000000..4f8f7433381
Binary files /dev/null and b/bg/python_installation/images/windows-plus-r.png differ
diff --git a/bg/python_installation/instructions.md b/bg/python_installation/instructions.md
new file mode 100644
index 00000000000..f01564c391f
--- /dev/null
+++ b/bg/python_installation/instructions.md
@@ -0,0 +1,121 @@
+> За читателите у дома: тази глава е разгледана във видеото [Инсталиране на Python & Редактор на код](https://www.youtube.com/watch?v=pVTaqzKZCdA).
+>
+> Този раздел е базиран на урок от Geek Girls Carrots (https://github.com/ggcarrots/django-carrots)
+
+Django е написан на Python. Имаме нужда от Python, за да направим нещо в Django. Нека започнем с инсталирането му! Искаме да инсталирате най-новата версия на Python 3, така че ако имате някоя по-ранна версия, ще трябва да я актуализирате. Ако вече имате версия 3.4 или по-нова, трябва да се оправите.
+
+Моля, инсталирайте нормален Python по следния начин, дори когато на вашия компютър е инсталиран Anaconda.
+
+
+
+Първо проверете дали вашият компютър използва 32-битова версия или 64-битова версия на Windows, в реда "Тип система" на страницата Информация за системата. За да стигнете до тази страница, опитайте един от следните методи:
+
+* Натиснете едновременно клавиша Windows и клавиша за Пауза/Прекъсване
+* Отворете контролния панел от менюто на Windows, след което отворете Система & Сигурност, след това Система
+* Натиснете бутона на Windows, след това отворете Настройки> Система> Информация
+
+Можете да изтеглите Python за Windows от уебсайта https://www.python.org/downloads/windows/. Кликнете върху връзката "Последно издание на Python 3 - Python x.x.x“. Ако вашият компютър работи с **64-битова** версия на Windows, изтеглете **изпълнителния инсталатор Windows x86-64**. В противен случай изтеглете **изпълнителния инсталатор Windows x86**. След като изтеглите инсталатора, трябва да го стартирате (щракнете двукратно върху него) и следвайте инструкциите там.
+
+Едно нещо, за което трябва да внимавате: По време на инсталацията ще забележите прозорец с надпис „Настройка“. Уверете се, че поставяте отметка в квадратчето „Добавяне на Python 3.6 към PATH“ или „Добавяне на Python към променливите на вашата среда“ и кликнете върху „Инсталиране сега“, както е показано тук (може да изглежда малко по-различно, ако инсталирате друга версия):
+
+
+
+Когато инсталацията приключи, може да видите диалогов прозорец с връзка, която можете да следвате, за да научите повече за Python или за версията, която сте инсталирали. Затворете или отменете този диалог - в този урок ще научите повече!
+
+Забележка: Ако използвате по-стара версия на Windows (7, Vista или някоя по-стара версия) и инсталатора на Python 3.6.x не успее с грешка, можете да опитате или:
+
+1. да инсталирате всички актуализации на Windows и да опитате отново да инсталирате Python; или
+2. да инсталирате [по-стара версия на Python](https://www.python.org/downloads/windows/), например, [3.4.6](https://www.python.org/downloads/release/python-346/).
+
+Ако инсталирате по-стара версия на Python, екранът за инсталиране може да изглежда малко по-различно от показаното по-горе. Уверете се, че сте стигнали до най-долу, за да видите „Добавяне на python.exe към Path“, след това щракнете върху бутона вляво и изберете „Ще бъде инсталиран на локален твърд диск“:
+
+
+
+
+
+
+
+> **Забележка** Преди да инсталирате Python в macOS, трябва да се уверите, че настройките ви за Mac позволяват инсталиране на пакети, които не са от App Store. Отидете на System Preferences (това е в папката Applications), щракнете върху "Security & Privacy", и след това върху раздела "General". Ако "Allow apps downloaded from:" е зададен на "Mac App Store,", променете го на "Mac App Store and identified developers".
+
+Трябва да отидете на уебсайта https://www.python.org/downloads/release/python-361/ и да изтеглите инсталатора на Python:
+
+* Изтеглете *macOS 64-битов/32-битов инсталатор* файл,
+* Щракнете два пъти * python-3.6.1-macosx10.6.pkg *, за да стартирате инсталатора.
+
+
+
+
+
+Много е вероятно вече да имате инсталиран Python извън кутията. За да проверите дали сте го инсталирали (и коя версия е), отворете конзола и въведете следната команда:
+
+{% filename %}command-line{% endfilename %}
+
+ $ python3 --version
+ Python 3.6.1
+
+
+Ако имате инсталирана друга версия на Python, поне 3.4.0 (например 3.6.0), тогава не е нужно да актуализирате. Ако нямате инсталиран Python или искате друга версия, първо проверете каква дистрибуция на Linux използвате със следната команда:
+
+{% filename %}command-line{% endfilename %}
+
+ $ grep '^NAME=' /etc/os-release
+
+
+След това, в зависимост от резултата, следвайте едно от следните ръководства за инсталиране под този раздел.
+
+
+
+
+
+Въведете тази команда в конзолата си:
+
+{% filename %}command-line{% endfilename %}
+
+ $ sudo apt install python3
+
+
+
+
+
+
+Използвайте тази команда в конзолата си:
+
+{% filename %}command-line{% endfilename %}
+
+ $ sudo dnf install python3
+
+
+Ако сте на по-стари версии на Fedora, може да получите грешка, че командата `dnf` не е намерена. В такъв случай трябва да използвате вместо `yum`.
+
+
+
+
+
+Използвайте тази команда в конзолата си:
+
+{% filename %}command-line{% endfilename %}
+
+ $ sudo zypper install python3
+
+
+
+
+Проверете дали инсталацията е била успешна, като отворите командния ред и изпълните командата `python3`:
+
+{% filename %}command-line{% endfilename %}
+
+ $ python3 --version
+ Python 3.6.1
+
+
+Показаната версия може да се различава от 3.6.1 - тя трябва да съответства на инсталираната от вас версия.
+
+**ЗАБЕЛЕЖКА:** Ако сте в Windows и получите съобщение за грешка, че `python3` не е намерен, опитайте да използвате `python` (без `3`) и проверете дали все още може да е версия на Python, която е 3.4.0 или по-нова. Ако и това не работи, можете да отворите нов команден ред и да опитате отново; това се случва, ако използвате командния ред, оставен отворен преди инсталирането на Python.
+
+* * *
+
+Ако имате някакви съмнения или ако нещо се обърка и нямате идея какво да правите по-нататък, моля, попитайте вашия ментор! Понякога нещата не вървят гладко и е по-добре да поискате помощ от някого с повече опит.
\ No newline at end of file
diff --git a/bg/python_introduction/README.md b/bg/python_introduction/README.md
new file mode 100644
index 00000000000..02952d2f6db
--- /dev/null
+++ b/bg/python_introduction/README.md
@@ -0,0 +1,1070 @@
+{% set warning_icon = '' %}
+
+# Въведение в Python
+
+> Част от тази глава е базирана на уроци от Geek Girls Carrots (https://github.com/ggcarrots/django-carrots).
+
+Да напишем малко код!
+
+## Python запитване
+
+> За читателите у дома: тази част е разгледана във видеото [Python Basics: Integers, Strings, Lists, Variables and Errors](https://www.youtube.com/watch?v=MO63L4s-20U).
+
+За да започнем да играем с Python, трябва да отворим *команден ред* на вашия компютър. Вече трябва да знаете как да го направите - научихте го в главата [Въведение в командния ред](../intro_to_command_line/README.md).
+
+След като сте готови, следвайте инструкциите по-долу.
+
+Искаме да отворим конзола на Python, затова въведете `python` в Windows или `python3` в Mac OS/Linux и натиснете `enter`.
+
+{% filename %}command-line{% endfilename %}
+
+ $ python3
+ Python 3.6.1 (...)
+ Type "help", "copyright", "credits" or "license" for more information.
+ >>>
+
+
+## Вашата първа Python команда!
+
+След като изпълните командата Python, подканата се промени в `>>>`. За нас това означава, че засега можем да използваме само команди на езика Python. Не е нужно да пишете `>>>` - Python ще направи това вместо вас.
+
+Ако искате да излезете от конзолата на Python във всеки момент, напишете `exit()` или използвайте прекия път `Ctrl + Z` за Windows и `Ctrl + D` за Mac/Linux. Тогава вече няма да виждате `>>>`.
+
+Засега не искаме да излизаме от конзолата Python. Искаме да научим повече за него. Нека започнем с въвеждане на някаква математика, като `2 + 3` и натискане на `enter`.
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> 2 + 3
+5
+```
+
+Хубаво! Вижте как отговорът изскочи? Python знае математика! Можете да опитате и други команди като:
+
+- `4 * 5`
+- `5 - 1`
+- `40 / 2`
+
+За да извършим експоненциално изчисление, да кажем 2 на степен 3, пишем в конзолата: {% filename %}command-line{% endfilename %}
+
+```python
+>>> 2 ** 3
+8
+```
+
+Забавлявайте се с това за малко и след това се върнете тук. :)
+
+Както можете да видите, Python е чудесен калкулатор. Ако се чудите какво още можете да направите...
+
+## Низове
+
+Какво ще кажете за вашето име? Въведете първото си име в кавички така:
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> "Ola"
+'Ola'
+```
+
+Сега създадохте първия си низ! Това е поредица от знаци, които могат да бъдат обработени от компютър. Низът винаги трябва да започва и завършва с един и същ символ. Това могат да бъдат единични (`'`) или двойни (`"`) кавички (няма разлика!) Кавичките казват на Python, че това, което е вътре в тях, е низ.
+
+Низовете могат да бъдат нанизани заедно. Опитайте това:
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> "Hi there " + "Ola"
+'Hi there Ola'
+```
+
+Можете също да умножите низове с число:
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> "Ola" * 3
+'OlaOlaOla'
+```
+
+Ако трябва да поставите апостроф във вашия низ, имате два начина да го направите.
+
+Използвайки двойни кавички:
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> "Runnin' down the hill"
+"Runnin' down the hill"
+```
+
+или да избягате от апострофа с обратна черта (``):
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> 'Runnin\' down the hill'
+"Runnin' down the hill"
+```
+
+Хубаво, а? За да видите името си с главни букви, напишете:
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> "Ola".upper()
+'OLA'
+```
+
+Току що използвахте метода `upper` върху вашия низ! Методът (като `upper()`) е поредица от инструкции, които Python изпълнява върху даден обект (`"Ola"`) след като е повикан.
+
+Ако искате да знаете, от колко на брой букви е вашето име, има функция и за това!
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> len("Ola")
+3
+```
+
+Чудите ли се понякога защо, когато извиквате функции с `.` на края на низа (като `"Ola".upper()`), като понякога извиквате първо функцията и поставяте низа в скоби? Е, в някой случаи функциите принадлежат на обекти, като `upper()`, които могат да се използва само върху низове. В този случай, наричам функцията метод. В други случаи, функциите които не принадлежат към определени типове и могат да бъдат използвани при различни обекти, също като `len()`. Затова даваме `"Ola"` като параметър на функцията `len`.
+
+### Обобщение
+
+Добре, достатъчно за низове. Досега научихте за:
+
+- **запитване** -- писане на команди (код) в Python среда в резултат дава отговори на Python език.
+- **числа и низове** -- в Python числата се използват за математически операции а низовете за текстови обекти.
+- **оператори** – като `+` и `*`, събират стойности за да получат нова
+- **функции** – като `upper()` и `len()`, извършващи се върху обектите.
+
+Това са основите на всеки програмен език, който учите. Готови ли сте за нещо по-сложно? Залагаме, че сте!
+
+## Грешки
+
+Нека опитаме нещо ново. Можем ли да вземем дължината на числото по същият начин, по който взехме дължината на нашето име? Напишете `len(304023)` и натиснете `enter`:
+
+{% filename %}{{ warning_icon }} command-line{% endfilename %}
+
+```python
+>>> len(304023)
+Traceback (most recent call last):
+ File "", line 1, in
+TypeError: object of type 'int' has no len()
+```
+
+Показа се първата ни грешка! {{ warning_icon }} е начина, по който ще ви показваме, че кода който се опитвате да пуснете няма да работи както се очаква. Грешките (дори и тези, които правим нарочно) са важна част от процеса на учене!
+
+Казва, че обектът от тип "int" (integers, или още цели числа) нямат дължина. Какво можем да направим сега? Може би да напишем числото ни като низ? Низовете имат дължина, нали така?
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> len(str(304023))
+6
+```
+
+Работи! Използвахме функцията `str` във функцията `len`. `str()` преобразува всичко в низове.
+
+- Функцията `str` преобразува нещата като **низове**
+- Функцията `int` преобразува нещата като **цели числа**
+
+> Важно: можем да преобразуваме числа в текст, но не можем да направим обратното -- както и да е какво би било `int('hello')`?
+
+## Променливи
+
+Важно понятие в програмирането са променливите. Променливата е нищо повече от име, което може да се използва по-късно в програмата. Програмистите ползват тези променливи да запазват данни. Това прави кода им по-четлив, така че не се налага да запомнят какви са тези неща.
+
+Нека кажем, че искаме да създаде променлива с име `name`:
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> name = "Ola"
+```
+
+Пишем name равно на Ola.
+
+Ако забелязахте, програмата ви не върна нищо както преди това. Как да разберем, че променливата съществува? Напишете `name` и натиснете бутона `enter`:
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> name
+'Ola'
+```
+
+Ихууу! Първата ти променлива! :) Винаги може да я промениш към какво се отнася:
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> name = "Sonja"
+>>> name
+'Sonja'
+```
+
+Може да я използвате и във функции:
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> len(name)
+5
+```
+
+Страхотно, нали? Сега, променливите могат да са какво ли не -- също така и числа! Пробвайте това:
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> a = 4
+>>> b = 6
+>>> a * b
+24
+```
+
+Но какво ако използваме грешното име Можете ли да отгатнете какво ще се случи? Нека опитаме!
+
+{% filename %}{{ warning_icon }} command-line{% endfilename %}
+
+```python
+>>> city = "Tokyo"
+>>> ctiy
+Traceback (most recent call last):
+ File "", line 1, in
+NameError: name 'ctiy' is not defined
+```
+
+Грешка! Както виждате, Python има различни видове грешки, като тази се казва **NameError**. Python винаги ще ви дава тази грешка, ако се опитвате да използвате променлива, която все още не е дефинирана. Ако попаднете на тази грешка по-късно, вижте дали не сте сбъркали при писането на някое от имената.
+
+Поиграйте се малко с това и вижте какво може да правите!
+
+## Фунцкията print
+
+Пробвайте това:
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> name = 'Maria'
+>>> name
+'Maria'
+>>> print(name)
+Maria
+```
+
+Когато напишете `name`, Python интерпретатора отговаря със низово *изображение* на променливата 'name', където буквите 'M-a-r-i-a' са обградени от единични кавички. Когато кажем `print(name)`, Python ще "отпечата" съдържанието на променливата на екрана, без кавичките, което е по-прилежно.
+
+Както ще видим по-късно `print()` също е полезен, когато искаме да отпечатаме неща от функциите, или когато искаме да отпечатаме неща на няколко реда.
+
+## Листове
+
+Освен низовете и целите числа, Python има всякакви видове типове от обекти. Сега ще въведем една от тях наречена **list**. Листоверте са точно това, което си мислите, че са: обекти, които са листове от други обекти. :)
+
+Давайте нататък и създайте лист:
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> []
+[]
+```
+
+Да, това е празен лист. Не е много полезен нали? Нека създадем лист с лотарийни номера. Не искаме да се повтаряме постоянно, така че ще използваме променлива:
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> lottery = [3, 42, 12, 19, 30, 59]
+```
+
+И така, имаме лист! Какво можем да правим с него? Нека видим колко лотарийни числа има в листа? Имате ли си на идея коя функция може да се използва за това? Това вече го знаете!
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> len(lottery)
+6
+```
+
+Да! `len()` може да ви даде броя на обектите в листа. Много удобно, нали? Може би и ще го сортираме:
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> lottery.sort()
+```
+
+Това не връща нищо, само променя реда, в който числата са показани в листа. Нека го отпечатаме отново и видим какво се случва:
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> print(lottery)
+[3, 12, 19, 30, 42, 59]
+```
+
+Както се вижда, числата в листа са вече подредени от по-малката към по-голямата стойност. Поздравления!
+
+Може би искаме да направим обратното?
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> lottery.reverse()
+>>> print(lottery)
+[59, 42, 30, 19, 12, 3]
+```
+
+Ако искате да добавите нещо към вашия лист, може да го направите като напишете следната команда:
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> lottery.append(199)
+>>> print(lottery)
+[59, 42, 30, 19, 12, 3, 199]
+```
+
+Ако искате да покажете само първото число, може да направите това като използвате **индекси**. Индекса е номерът, който казва къде в листа се появява елемента. Програмистите предпочитат да започват броенето от 0, така че първият обект в листа е с индекс 0, следващия е с 1 и т.н. Опитайте това:
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> print(lottery[0])
+59
+>>> print(lottery[1])
+42
+```
+
+Както може да видите, можете да достъпите различни обекти от листа си като използвате името на листа и индекс със квадратни скоби.
+
+За да премахнете нещо от листа си ще трябва да използвате **индексите**, които научихме по-горе и метода `pop()`. Нека пробваме пример и затвърдим това, което научихме до момента: ще отстраним първото число от листа ни.
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> print(lottery)
+[59, 42, 30, 19, 12, 3, 199]
+>>> print(lottery[0])
+59
+>>> lottery.pop(0)
+59
+>>> print(lottery)
+[42, 30, 19, 12, 3, 199]
+```
+
+Работи безупречно!
+
+За повече веселба, пробвайте други индекси: 6, 7, 1000, -1, -6 or -1000. Пробвайте се да предположите какъв би могъл да е резултата от командата. Имат ли смисъл резултатите?
+
+Можете да намерите лист с всички възможни методи в тази глава от документацията на Python: https://docs.python.org/3/tutorial/datastructures.html
+
+## Речници
+
+> За читателите у дома: тази част е показана във видеото [Python Basics: Dictionaries](https://www.youtube.com/watch?v=ZX1CVvZLE6c).
+
+Речника е подобен на листа, но можете да достъпвате стойностите му като погледнете за ключа вместо числения индекс. Синтаксисът за дефиниране на празен речник е:
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> {}
+{}
+```
+
+Това показва, че в момента създадохте празен речник. Ура!
+
+Сега, опитайте се да напишете следната команда (опитайте се да заместите със своя информация):
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> participant = {'name': 'Ola', 'country': 'Poland', 'favorite_numbers': [7, 42, 92]}
+```
+
+С тази команда, току що създадохте променлива с име `participant` с три елемент-стойност (keys-value) двойки.
+
+- Елементът `name` се отнася за стойността `'Ola'` (`низ` обект),
+- `country` се отнася за `'Poland'` (друг `низ`),
+- and `favorite_numbers` се отнася за `[7, 42, 92]` (`лист` с три числа в него).
+
+Може да проверите съдържанието на всеки от елементите с този синтаксис:
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> print(participant['name'])
+Ola
+```
+
+Виждате ли, подобно е на лист. Но не е необходимо да помните индекса -- само името.
+
+Какво се случва, когато попитаме Python за стойността на елемент, който не съществува? Можете ли да познаете? Нека опитаме и видим:
+
+{% filename %}{{ warning_icon }} command-line{% endfilename %}
+
+```python
+>>> participant['age']
+Traceback (most recent call last):
+ File "", line 1, in
+KeyError: 'age'
+```
+
+Вижте, друга грешка! Тази е **KeyError**. Python е много услужлив и ти казва, че елемент `'age'` не съществува в този речник.
+
+Кога да използвате речник и кога лист? Това е добър въпрос. Помислете за отговор преди да видите следващия ред.
+
+- Ако имате нужда просто от подредена последователност от елементи? Ползвайте лист.
+- Ако трабва да асоциирате стойности с елементи, които искате да може да ги видите на по-късен етап (чрез елемент - by key)? Използвайте речник.
+
+Речниците са като листове, но *непостоянни*, което означава, че могат да бъдат променени след като бъдат създадени. Може да добавяте нови двойки елемент-стойност към речника след като е създаден ето така:
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> participant['favorite_language'] = 'Python'
+```
+
+Като при листовете, използването на метода `len()` върху речника връща броя на двойката елемент-стойност в речника. Продължете и напишете тази команда:
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> len(participant)
+4
+```
+
+Надявам се да има смисъл това което правим досега. :) Готови ли сте за още веселба с речниците? Прочетете някои невероятни неща.
+
+Можете да използвате метода `pop()` да изтриете елемент от речника. Да кажем, че искаме да премахнем въведението, което се отанся за елемента `'favorite_numbers'`, напишете следната команда:
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> participant.pop('favorite_numbers')
+[7, 42, 92]
+>>> participant
+{'country': 'Poland', 'favorite_language': 'Python', 'name': 'Ola'}
+```
+
+Както се вижда, двойката елемент-стойност отнасяща се за 'favorite_numbers' беше премахната.
+
+Както и това, можете да промените стойността, която отговаря на вече създаден елемент в речника. Напишете това:
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> participant['country'] = 'Germany'
+>>> participant
+{'country': 'Germany', 'favorite_language': 'Python', 'name': 'Ola'}
+```
+
+Както виждате, стойността на елемента `'country'` беше променен от `'Poland'` на `'Germany'`. :) Вълнуващо? Ураа! Току що научихте още едно невероятно нещо.
+
+### Обобщение
+
+Страхотно! Вече знаете много за програмирането. В тази последна част научихте за:
+
+- **грешки** -- знаете как да четете и разбирате грешките които се показват, ако Python не разбира командата която сте задали
+- **променливи** – имена на обектите, които ви позволяват да пишете код по-лесно и да правят кода ви по-четлив
+- **листове** –листовете са обекти запазени в определен ред
+- **речници** – обекти запазени като двойки от елемент-стойност (key-value pairs)
+
+Вълнувате ли се за следващата част? :)
+
+## Сравняване на неща
+
+> За читателите у вома: тази част е показана във видеото [Python Basics: Comparisons](https://www.youtube.com/watch?v=7bzxqIKYgf4).
+
+Голяма част от програмирането включва сравняване на неща. Какво е най-лесното нещо което може да се сравни? Числата! Нека видим как работи:
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> 5 > 2
+True
+>>> 3 < 1
+False
+>>> 5 > 2 * 2
+True
+>>> 1 == 1
+True
+>>> 5 != 2
+True
+```
+
+Дадохме на Python да сравни няколко числа. Както може да видите, Python не само че може да сравни числата, но може също така да сравнява и резултатите от метода. Супер, нали?
+
+Чудите ли се защо използвахме два знака за равно `==` един до друг за да сравним дали числата са равни? Използваме едно равно `=` за да причислим стойност на променливите. Винаги, ама **винаги** трябва да иползваме две от тях – `==` – ако искаме да проверим дали две неща са равни едно на друго. Можем също така да кажем, че не искаме двете неща да са равни едно на друго. Затова, използваме символа `!=`, както е показано в примера по-горе.
+
+Дайте на Python още две задачки:
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> 6 >= 12 / 2
+True
+>>> 3 <= 2
+False
+```
+
+Виждали сме `>` и `<`, но какво означават `>=` и `<=`? Четем ги по този начин:
+
+- x `>` y означава: x е по-голямо от y
+- x `>` y означава: x е по-малко от y
+- x `<=` y означава: x е по-малко или равно на y
+- x `>=` y означава: x е по-голямо или равно на y
+
+Страхотно! Искате ли да направите още нещо? Пробвайте това:
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> 6 > 2 and 2 < 3
+True
+>>> 3 > 2 and 2 < 1
+False
+>>> 3 > 2 or 2 < 1
+True
+```
+
+Може да дадете на Python колкото си искате числа да сравнява и ще ви даде отговор! Много умно, нали?
+
+- **and** – ако използвате оператора `and`, двете сравнения трябва да са True за да бъде цялата команда True
+- **or** – ако използвате оператора `or`, само едното сравнение трябва да е True за да бъде цялата команда True
+
+Чували ли сте за израза "сравнение на ябълки и портокали"? Нека пробваме подобно нещо в Python:
+
+{% filename %}{{ warning_icon }} command-line{% endfilename %}
+
+```python
+>>> 1 > 'django'
+Traceback (most recent call last):
+ File "", line 1, in
+TypeError: '>' not supported between instances of 'int' and 'str'
+```
+
+Тук виждате, както при израза, Python не е способен да сравни число (`int`) и низ (`str`). Вместо това ни показва грешка **TypeError** и ни казва, че двата типа не могат да бъдат сравнени.
+
+## Булеви променливи
+
+По между другото, току що научихте за нов тип обект в Python. Нарича се **Булев (Boolean)**.
+
+Има само два вида булеви променливи:
+
+- True
+- False
+
+Но за Python да разбере това, винаги трябва да пишете 'True' (като първата буква е главна, а следващите малки). **true, TRUE, and tRUE няма да работят – само True е правилно.** (Същото се отнася и до 'False'.)
+
+Булевите стойности могат също да са променливи! Вижте тук:
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> a = True
+>>> a
+True
+```
+
+Може също да го направите по този начин:
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> a = 2 > 5
+>>> a
+False
+```
+
+Практикувайте и се повеселете с булевите стойности като се опитате да напишете следните команди:
+
+- `True and True`
+- `False and True`
+- `True or 1 == 1`
+- `1 != 2`
+
+Поздраления! Булевите стойности са едни от най-готините неща в програмирането, и ти току що се научи как да ги използваш!
+
+# Запази!
+
+> За читателите у дома: тази част е показана във видеото [Python Basics: Saving files and "If" statement](https://www.youtube.com/watch?v=dOAg6QVAxyk)
+
+До тук писахме всичкия си python код в интерпретатора, който ни ограничава да използваме само едни ред да впишем кода. Обикновено програмите са запазени във файлове и после изпълнени от **интерпретатора** или **компилатора** ни. Досега пускахме нашите програми по една на ред в Python интерпретатора. Ще са ни необходими малко повече редове от код за следващите няколко задачи, затова бързо ще направим това:
+
+- Излезем от Python интерпретатора
+- Отворим редактор за текс по избор
+- Запазим малко код в нов python файл
+- Пуснете го!
+
+За да излезнем от Python интерпретатора, който използвахме, пише следната функция `exit()`
+
+{% filename %}command-line{% endfilename %}
+
+```python
+>>> exit()
+$
+```
+
+Това ще ви върне в началното състояние на конзолата (терминала).
+
+По-рано избрахме нашия редактор от секцията за [code editor](../code_editor/README.md). Сега трябва да го отворим и да напишем малко код в нов файл (ако използвате Chromebook, създайте нов файл в cloud IDE и отворете файла, който ще е в редактора):
+
+{% filename %}editor{% endfilename %}
+
+```python
+print('Hello, Django girls!')
+```
+
+Очевидно, вече сте по-обиграни Python разработчици, така че напишете код, който научихте днес.
+
+Сега трябва да запазим файла и да му дадем описателно име. Нека наречем файла **python_intro.py** и го запазим на началния си екран. Можем да именуваме файла си както пожелаем, но е важно да сме сигурни, че завършва на **.py**. Разширението **.py** казва на операционната система, че това е **Python executable file** и Python може да го обработи.
+
+> **Забележка:** Трябва да забелязахте, че едни от най-готините неща в редактора са: цветовете! В конзолата на Python всичко беше един цват; сега трябва да виждате, че `print` функцията е с различен цвят от цвета на низа. Това се нарича "syntax highlighting", и е много полезна добавка когато пишем код. Цвета на нещата ще ви подсказва, например ако имате незатворени низове или сте объркали ключова дума (като при писането на функцията `def`, както ще видим по-долу). Това е една от причините да изполваме редактор за писане на код. :) :)
+
+С вече запазения файл е време да го пуснем! Да използваме това, което научихме от секцията с командите. Ползвайте терминала (конзолата) за да смените директорията до началния си екран (desktop).
+
+
+
+На Mac, командата ще излгежда по този начин:
+
+{% filename %}command-line{% endfilename %}
+
+ $ cd ~/Desktop
+
+
+
+
+
+
+На Linux, ще изглежда така:
+
+{% filename %}command-line{% endfilename %}
+
+ $ cd ~/Desktop
+
+
+(Помнете, че думата "Desktop" може да е преведена на вашия език.)
+
+
+
+
+
+На Windows Command Prompt ще изглежда така:
+
+{% filename %}command-line{% endfilename %}
+
+ > cd %HomePath%\Desktop
+
+
+
+
+
+
+И на Windows Powershell ще изглежда така:
+
+{% filename %}command-line{% endfilename %}
+
+ > cd $Home\Desktop
+
+
+
+
+Ако се затруднявате, поискайте помощ. Затова са менторите!
+
+Сега ползвайте Python за да изпълни кода във файла ето така:
+
+{% filename %}command-line{% endfilename %}
+
+ $ python3 python_intro.py
+ Hello, Django girls!
+
+
+Забележка: на Windows 'python3' не е разпознат като команда. Вместо това, използвайте 'python' за да стартирате файла:
+
+{% filename %}command-line{% endfilename %}
+
+```python
+> python python_intro.py
+```
+
+Браво! Току що пуснахте първата си програма на Python, която беше запазена на файл. Чувствате ли се страхотно?
+
+Сега може да се прехвърлим на по-важно средство в програмирането:
+
+## If … elif … else
+
+Много неща в кода трябва да се изпълнят само ако са преминали определени условия. Затова Python има нещо, наречено **if условна конструкция**.
+
+Заместете кода във файла си **python_intro.py** с това:
+
+{% filename %}python_intro.py{% endfilename %}
+
+```python
+if 3 > 2:
+```
+
+Ако запазим и стартираме файла ще видим грешка като тази:
+
+{% filename %}{{ warning_icon }} command-line{% endfilename %}
+
+ $ python3 python_intro.py
+ File "python_intro.py", line 2
+ ^
+ SyntaxError: unexpected EOF while parsing
+
+
+Python очаква от нас да дадем следващи инсктрукции какво да се изпълни в условието `3 > 2` за да бъде вярно (или `True` за същата цел). Нека накараме Python да отпечата “It works!”. Променете кода си във файла с това:
+
+{% filename %}python_intro.py{% endfilename %}
+
+```python
+if 3 > 2:
+ print('It works!')
+```
+
+Забелязахте ли как изписахме следващия ред от код с 4 празни места навътре? Трябва да направим това за да може Python да знае, кой код да изпълни в случай, че е вярно условието. Може да използвате едно празно място, но почти всеки Python програмист използва 4, тъй като изглежда по-прилежно. Използването на бутона Tab също се равнява на 4 места, ако сте направили редактора си да прави така. Когато направите избор не го променяйте! Ако вече сте използвали 4 места за в бъдеще ползвайте 4 места - в противен случай може да попаднете на затруднения.
+
+Запазете и го стартирайте отново:
+
+{% filename %}command-line{% endfilename %}
+
+```python
+$ python3 python_intro.py
+It works!
+```
+
+Забележка: Помнете, че на Windows, 'python3' не се разпознава като команда. От сега нататък, заместете 'python3' с 'python' за да изпълните файла.
+
+### Какво ако условието не е вярно (True)?
+
+В предходните примери, кода се изпълняваше само ако условието е вярно (True). Но Python има също `elif` и `else` условия:
+
+{% filename %}python_intro.py{% endfilename %}
+
+```python
+if 5 > 2:
+ print('5 is indeed greater than 2')
+else:
+ print('5 is not greater than 2')
+```
+
+Когато това се изпълни ще се отпечата:
+
+{% filename %}command-line{% endfilename %}
+
+ $ python3 python_intro.py
+ 5 is indeed greater than 2
+
+
+Ако 2 беше по-голямо число от 5, тогава втората команда щеше да се изпълни. Нека видим как работи `elif` :
+
+{% filename %}python_intro.py{% endfilename %}
+
+```python
+name = 'Sonja'
+if name == 'Ola':
+ print('Hey Ola!')
+elif name == 'Sonja':
+ print('Hey Sonja!')
+else:
+ print('Hey anonymous!')
+```
+
+и се изпълнява:
+
+{% filename %}command-line{% endfilename %}
+
+ $ python3 python_intro.py
+ Hey Sonja!
+
+
+Видяхте ли какво се случи там? `elif` ви даде възможност да добавите още едно условие в случай, че предното се провали.
+
+Може да добавяте колкото си искате `elif` условия след първоначалното `if` условие. Например:
+
+{% filename %}python_intro.py{% endfilename %}
+
+```python
+volume = 57
+if volume < 20:
+ print("It's kinda quiet.")
+elif 20 <= volume < 40:
+ print("It's nice for background music")
+elif 40 <= volume < 60:
+ print("Perfect, I can hear all the details")
+elif 60 <= volume < 80:
+ print("Nice for parties")
+elif 80 <= volume < 100:
+ print("A bit loud!")
+else:
+ print("My ears are hurting! :(")
+```
+
+Python преминава и тества през всеки ред и отпечатва:
+
+{% filename %}command-line{% endfilename %}
+
+ $ python3 python_intro.py
+ Perfect, I can hear all the details
+
+
+## Коментари
+
+Коментрите са редове, започващи с `#`. Може да пишете каквото искате след `#` и Python ще го игнорира. Коментарите са направени да правят кода по-лесен за четене и разбиране от другите хора.
+
+Нека видим как изглежда:
+
+{% filename %}python_intro.py{% endfilename %}
+
+```python
+# Change the volume if it's too loud or too quiet
+if volume < 20 or volume > 80:
+ volume = 50
+ print("That's better!")
+```
+
+Не е необходимо да пишете коментар за всеки ред от код, но те са много подходящи да обяснят какво прави самия код, или да дадат обобщение, когато се прави нещо сложно.
+
+### Обобщение
+
+В последните няколко упражнения научихте как да:
+
+- **сравнявате** – в Python може да сравнявате като използвате `>`, `>=`, `==`, `<=`, `<` и `and`, `or` оператори
+- използвате **булеви променливи** – типа на обекта може да приема само две стойности: `True` или `False`
+- **запазвате файлове** – запазване на кода във файлове, така че да могат да се изпълняват по-големи програми.
+- използвате **if … elif … else** – условна конструкция, която ви позволява да изпълнявате код когато определени условия се изпълнят.
+- пишете **коментари** - редовете в Python, които не се изпълняват и дават пояснения за кода ви
+
+Време е за последната част от тази глава!
+
+## Вашите собствени функции!
+
+> За читателите у дома: тази част е показана във видеото [Python Basics: Functions](https://www.youtube.com/watch?v=5owr-6suOl0).
+
+Помните ли функциите като `len()`, които изпълнихте в Python? Така, добри новини - сега ще научите как да напишете свои фукции!
+
+Функцията е последователност от инструкции, така че Python да може да я изпълнин. Всяка функция в Python започяа с ключовата дума `def`, с което се дава име на функцията и може да има няколко параметъра. Нека пробваме. Заместете кода във файла **python_intro.py** със следното:
+
+{% filename %}python_intro.py{% endfilename %}
+
+```python
+def hi():
+ print('Hi there!')
+ print('How are you?')
+
+hi()
+```
+
+Добре, първата ви функция е готова!
+
+Може би се чудите защо написахме името на функцията в края на файла. Когато пишем `def hi():` и следващите редове започват по-навътре, това оказва какво трябва да направи функцията `hi()`. Python ще прочете и запомни тези инструкции, но няма да изпълни все още функцията. За да кажем на Python да изпълни функцията, трябва да извикаме вункцията с `hi()`. Python чете файла и изпълнява от горе до долу, затова трябва да дефинираме функцията преди да сме я повикали.
+
+Нека го стартираме и видим какво се случва:
+
+{% filename %}command-line{% endfilename %}
+
+ $ python3 python_intro.py
+ Hi there!
+ How are you?
+
+
+Забележка: ако не работи не се паникьосвайте! Резултатът ще ви помогне да разберете защо:
+
+- Ако получите грешка `NameError`, това най-вероятно означава, че сте направили грешка при писането, такаче трябва да проверите дали имената са същите при създаването на функцията `def hi():` и когато я извиквате `hi()`.
+- Ако получите грешка `IndentationError`, вижте дали двата реда с функцията `print` са отместени на едно и също растояние: python иска кода във функцията да бъде безупречно подреден.
+- Ако на изхода няма нищо, проверете дали последното `hi()` *не е* отместено - ако е , тази част също ще се превърне в част от функцията и никога няма да се изпълни
+
+Нека съставим първата си функция с параметри. Ще променим предния пример - функцията, която казва 'hi' на човека, който пуска програмата - с име:
+
+{% filename %}python_intro.py{% endfilename %}
+
+```python
+def hi(name):
+```
+
+Както се вижда, дадохме на функцията си стойност, която нарекохме `name`:
+
+{% filename %}python_intro.py{% endfilename %}
+
+```python
+def hi(name):
+ if name == 'Ola':
+ print('Hi Ola!')
+ elif name == 'Sonja':
+ print('Hi Sonja!')
+ else:
+ print('Hi anonymous!')
+
+hi()
+```
+
+Запомнете: `print` функцията е поместена 4 места навътре спрямо `if` условието. Това е така, защото функцията се изпълнява, ако е изпълнено условието. Нека видим как работи:
+
+{% filename %}{{ warning_icon }} command-line{% endfilename %}
+
+ $ python3 python_intro.py
+ Traceback (most recent call last):
+ File "python_intro.py", line 10, in
+ hi()
+ TypeError: hi() missing 1 required positional argument: 'name'
+
+
+Опаа, грешка. За щастие, Python ни показва много полезно съобщение за грешката. Казва ни, че фукнцията `hi()` (която ние дефинирахме) има аргумент, който се изисква (с име `name`) и че сме забравили да го приложим, когато извикваме фунцкията. Нека оправим това в края на файла:
+
+{% filename %}python_intro.py{% endfilename %}
+
+```python
+hi("Ola")
+```
+
+И да стартираме отначало:
+
+{% filename %}command-line{% endfilename %}
+
+ $ python3 python_intro.py
+ Hi Ola!
+
+
+А ако сменим името?
+
+{% filename %}python_intro.py{% endfilename %}
+
+```python
+hi("Sonja")
+```
+
+И стартираме отново:
+
+{% filename %}command-line{% endfilename %}
+
+ $ python3 python_intro.py
+ Hi Sonja!
+
+
+Сега, какво мислите, че ще стане ако напишете ново име? (Не Ola или Sonja.) Опитайте и вижте дали сте прави. Трябва да отпечата това:
+
+{% filename %}command-line{% endfilename %}
+
+ Hi anonymous!
+
+
+Това е страхотно, нали? При това не трбва да се повтаряте всеки път, когато смените името на човека, който функцията трябва да поздрави. Затова са ни необходими функциите - никога да не повтаряш кода си!
+
+Нека опитаме нещо по-хитро - имаме повече от две имена и писането на условия за всяко едно от тях ще отнеме много време, нали така? Заместете съдържание на файла си със следното:
+
+{% filename %}python_intro.py{% endfilename %}
+
+```python
+def hi(name):
+ print('Hi ' + name + '!')
+
+hi("Rachel")
+```
+
+Нека извикаме кода:
+
+{% filename %}command-line{% endfilename %}
+
+ $ python3 python_intro.py
+ Hi Rachel!
+
+
+Поздравления! Току що научихте как да пишете функции! :)
+
+## Цикли
+
+> За читателите у дома: тази част е показана във видеото [Python Basics: For Loop](https://www.youtube.com/watch?v=aEA6Rc86HF0)
+
+Това вече е последната част. Мина бързо, нали? :)
+
+Програмистите не обичат да е повтарят. Програмирането се отнася до автоматизация, така че не искаме да поздравяваме всеки човек по име като изписваме за всеки по отделно, нали? Ето къде циклите идват в употреба.
+
+Все още си спомняте листовете? Нека направим лист с момичета:
+
+{% filename %}python_intro.py{% endfilename %}
+
+```python
+girls = ['Rachel', 'Monica', 'Phoebe', 'Ola', 'You']
+```
+
+Искаме да поздравим всяка една от тях по име. Имаме функцията `hi` да направи това, така че нека я използваме в цикъл:
+
+{% filename %}python_intro.py{% endfilename %}
+
+```python
+for name in girls:
+```
+
+Конструкцията `for` се държи подобно на конструкцията `if`; кода под него трябва да е отместен с четири места навътре.
+
+Ето целия код, който трябва да е във файла:
+
+{% filename %}python_intro.py{% endfilename %}
+
+```python
+def hi(name):
+ print('Hi ' + name + '!')
+
+girls = ['Rachel', 'Monica', 'Phoebe', 'Ola', 'You']
+for name in girls:
+ hi(name)
+ print('Next girl')
+```
+
+И когато го стартираме:
+
+{% filename %}command-line{% endfilename %}
+
+ $ python3 python_intro.py
+ Hi Rachel!
+ Next girl
+ Hi Monica!
+ Next girl
+ Hi Phoebe!
+ Next girl
+ Hi Ola!
+ Next girl
+ Hi You!
+ Next girl
+
+
+Както виждате всичко, което сложите вътре във `for` конструкцията с отместването ще бъде повторено за всеки елемент от листа `girls`.
+
+Може също да използвате `for` цикъл за числа като използвате фунцкията `range` :
+
+{% filename %}python_intro.py{% endfilename %}
+
+```python
+for i in range(1, 6):
+ print(i)
+```
+
+Което ще отпечата:
+
+{% filename %}command-line{% endfilename %}
+
+ 1
+ 2
+ 3
+ 4
+ 5
+
+
+`range` е функция, която създава лист от номера едно след друго (тези номера са дадени от вас като стойности).
+
+Забележете, че втория параметър, който сте дали не се включва в листа с показаните числа от Python (което означава, че `range(1, 6)` брои от 1 до 5, без да включва числото 6). Това е така, защото "range" е полу-отворена функция, което означава, че включва първата стойност, но не и последната.
+
+## Обобщение
+
+Това е! **Ти си върха!** Това беше сложна глава, така че трябва да сте горди със себе си. Ние определено сме горди с това, което постигнахте досега!
+
+За официалното и пълно ръководство на Python посетете visit https://docs.python.org/3/tutorial/. Това ще ви даде много по-подробни и цялостни знания за езика. Със здраве! :)
+
+Може би искате да направите нещо друго за кратко - разтягане, разходка, да ви отпочинат очите - преди да отидем към следващата глава. :)
+
+
\ No newline at end of file
diff --git a/bg/python_introduction/images/cupcake.png b/bg/python_introduction/images/cupcake.png
new file mode 100644
index 00000000000..8c1820adee8
Binary files /dev/null and b/bg/python_introduction/images/cupcake.png differ
diff --git a/bg/styles/website.css b/bg/styles/website.css
new file mode 100644
index 00000000000..917a9d65a50
--- /dev/null
+++ b/bg/styles/website.css
@@ -0,0 +1,64 @@
+
+/* add text to top menu items */
+
+.book-header .fa::after {
+ text-transform: none;
+ font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
+}
+.book-header .fa-align-justify::after {
+ content: ' Show Outline';
+ text-transform: none;
+ font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
+}
+.book.with-summary .book-header .fa-align-justify::after {
+ content: ' Hide Outline';
+}
+.book-header .fa-globe::after {
+ content: ' Language';
+}
+.book-header .fa-font::after {
+ content: ' Font Settings';
+}
+@media (max-width:600px) {
+ .book-header .fa-font::after {
+ content: ' Font';
+ }
+ .book-header .js-toolbar-action.pull-right { /* social sharing links */
+ display: none;
+ }
+}
+
+/* add text to the Next & Prev arrows */
+
+.navigation-prev::after {
+ content: 'Previous';
+ font-size: 20pt;
+ vertical-align: text-bottom;
+ line-height: 44px;
+}
+.navigation-next::after {
+ content: 'Next';
+ font-size: 20pt;
+ vertical-align: text-bottom;
+ line-height: 44px;
+}
+
+@media (max-width:1240px) {
+ /* on small viewports, the arrows are shown on the side, so move text around to look better */
+ .navigation-next::after {
+ content: none;
+ }
+ .navigation-next::before {
+ content: 'Next';
+ font-size: 20pt;
+ vertical-align: text-bottom;
+ line-height: 44px;
+ }
+}
+
+/* fine tune text size to not overlap main body text on very specific viewport sizes */
+@media (min-width:1241px) and (max-width:1274px) {
+ .navigation-prev::after {
+ font-size: 16pt;
+ }
+}
diff --git a/bg/template_extending/README.md b/bg/template_extending/README.md
new file mode 100644
index 00000000000..d9278924a4d
--- /dev/null
+++ b/bg/template_extending/README.md
@@ -0,0 +1,147 @@
+# Разширяване на шаблона
+
+Друго хубаво нещо, което Django има за вас, е **разширяване на шаблона**. Какво означава това? Това означава, че можете да използвате същите части на вашия HTML за различни страници на вашия уебсайт.
+
+Шаблоните помагат, когато искате да използвате една и съща информация или оформление на повече от едно място. Не е нужно да се повтаряте във всеки файл. И ако искате да промените нещо, не е необходимо да го правите във всеки шаблон, само в един!
+
+## Създайте основен шаблон
+
+Базовият шаблон е най-основният шаблон, който разширявате на всяка страница от вашия уебсайт.
+
+Нека създадем `base.html` файл в `blog/templates/blog/`:
+
+ blog
+ └───templates
+ └───blog
+ base.html
+ post_list.html
+
+
+След това го отворете в редактора на кода и копирайте всичко от `post_list.html` във `base.html` файл, като този:
+
+{% filename %}blog/templates/blog/base.html{% endfilename %}
+
+```html
+{% load static %}
+
+
+ Django Girls blog
+
+
+
+
+
+
+
+
+
+```
+
+След това в `base.html` заменете съдържанието в секцията `` (всичко между `` и ``) с това:
+
+{% filename %}blog/templates/blog/base.html{% endfilename %}
+
+```html
+
+
+
+```
+
+{% raw %}Може да забележите, че това замени всичко от `{% for post in posts %}` до `{% endfor %}` с: {% endraw %}
+
+{% filename %}blog/templates/blog/base.html{% endfilename %}
+
+```html
+{% block content %}
+{% endblock %}
+```
+
+Но защо? Току-що създадохте `block`! Използвахте шаблонния маркер `{% block %}`, за да направите област, в която да бъде вмъкнат HTML код. Този HTML код ще идва от друг шаблон, който разширява този шаблон (`base.html`). Ще ви покажем как да направите това след малко.
+
+Сега запишете `base.html` и отворете вашия `blog/templates/blog/post_list.html` отново в редактора на кода. {% raw %} Ще премахнете всичко по-горе `{% for post in posts %}` и под `{% endfor %}`. Когато приключите, файлът ще изглежда така:{% endraw %}
+
+{% filename %}blog/templates/blog/post_list.html{% endfilename %}
+
+```html
+{% for post in posts %}
+
+{% endfor %}
+```
+
+Искаме да използваме това като част от нашия шаблон за всички съдържателни блокове. Време е да добавите блокови тагове към този файл!
+
+{% raw %}Искате вашият маркер за блока да съвпада с маркера във вашия `base.html` файл. Освен това искате той да включва всички кодове, които принадлежат във вашите блокове на съдържание. За целта поставете всичко между `{% block content %}` и `{% endblock %}`. Ето така:{% endraw %}
+
+{% filename %}blog/templates/blog/post_list.html{% endfilename %}
+
+```html
+{% block content %}
+ {% for post in posts %}
+
+ {% endfor %}
+{% endblock %}
+```
+
+Остана само едно нещо. Трябва да свържем тези два шаблона заедно. За това става въпрос в разширяващите се шаблони! Ще направим това, като добавим маркер за разширения в началото на файла. Ето така:
+
+{% filename %}blog/templates/blog/post_list.html{% endfilename %}
+
+```html
+{% extends 'blog/base.html' %}
+
+{% block content %}
+ {% for post in posts %}
+
+ {% endfor %}
+{% endblock %}
+```
+
+Това е! Запазете файла и проверете дали уебсайтът ви все още работи правилно. :)
+
+> Ако получите грешката `TemplateDoesNotExist`, това означава, че няма `blog/base.html` файл и имате `runserver` работещ в конзолата. Опитайте се да го спрете (като натиснете Ctrl + C - клавишите Control и C заедно) и го рестартирайте, като изпълните команда `python manage.py runserver`.
\ No newline at end of file
diff --git a/bg/whats_next/README.md b/bg/whats_next/README.md
new file mode 100644
index 00000000000..ed55fd3b3b4
--- /dev/null
+++ b/bg/whats_next/README.md
@@ -0,0 +1,42 @@
+# Какво следва?
+
+Поздравете се! **Ти си напълно страхотен**. Гордеем се! <3
+
+### Какво да правим сега?
+
+Направете почивка и се отпуснете! Току-що направихте нещо наистина огромно.
+
+След това, не забравяйте да следвате Django Girls във [ Facebook ](http://facebook.com/djangogirls) или [ Twitter ](https://twitter.com/djangogirls).
+
+### Можете ли да препоръчате допълнителни ресурси?
+
+Да! Има *много* онлайн ресурси за научаване на всякакви умения за програмиране - може да бъде доста трудно да разберете как да продължите по-натам, но не се безспокойте. Каквито и да бяха интересите ви преди да дойдете на Django Girls и каквито и интереси сте развили по време на ръководството, ето някои безплатни ресурси (или ресурси с големи безплатни компоненти), които можете да използвате, за да стигнете до това, което искате.
+
+#### Django
+
+- Другата ни книга, [Django Girls Tutorial: Extensions](https://tutorial-extensions.djangogirls.org/)
+- [Официалното ръководство на Django](https://docs.djangoproject.com/en/2.2/intro/tutorial01/)
+- [Първи стъпки с видео уроци на Django](http://www.gettingstartedwithdjango.com/)
+
+#### HTML, CSS и JavaScript
+
+- [Курс за уеб разработка на Codecademy](https://www.codecademy.com/learn/paths/web-development)
+- [freeCodeCamp](https://www.freecodecamp.org/)
+
+#### Python
+
+- [Курс по Python на Codecademy](https://www.codecademy.com/learn/learn-python)
+- [Курс по Python на Google](https://developers.google.com/edu/python/)
+- [Learn Python The Hard Way book](http://learnpythonthehardway.org/book/) – първоначалните упражнения са безплатни
+- [New Coder tutorials](http://newcoder.io/tutorials/) - това са различни практически примери за това как можете да използвате Python
+- [ edX ](https://www.edx.org/course?search_query=python) - можете да участвате в повечето курсове безплатно, но ако искате сертификат или по-голяма квалификация, това ще струва пари
+- [Python специализация на Coursera](https://www.coursera.org/specializations/python) - можете да участвате в няколко видео лекции безплатно и можете да спечелите сертификат на Coursera, като вземете тези курсове
+- [Python for Everybody](https://www.py4e.com/) - безплатна и отворена версия на специализирания Python Coursera за всеки
+
+#### Работа с данни
+
+- [Курсът по научни данни на Codecademy](https://www.codecademy.com/learn/paths/data-science)
+- [edX](https://www.edx.org/course/?search_query=python&subject=Data%20Analysis%20%26%20Statistics) - можете да участвате в повечето курсове безплатно, но ако искате сертификат или по-голяма квалификация, това ще струва пари
+- [Dataquest](https://www.dataquest.io/) - първите 30 "мисии" са безплатни
+
+Нямаме търпение да видим какво ще изградите след това!
\ No newline at end of file
diff --git a/book.json b/book.json
index 6524e90e82a..819d89ec3ce 100644
--- a/book.json
+++ b/book.json
@@ -1,25 +1,102 @@
- {
+{
+ "gitbook": ">=3.2.0",
+ "variables": {
+ "py_version": "3.12",
+ "py_release": "3.12.3",
+ "py_min_version": "3.10",
+ "py_min_release": "3.10.13",
+ "pa_py_version": "3.10",
+ "django_version": "5.1.2"
+ },
"links": {
- "sidebar": {
- "Need help? Talk to us!": "https://gitter.im/DjangoGirls/tutorial"
- }
},
-
+ "pdf": {
+ "fontSize": 16
+ },
"plugins": [
- "anchors@0.5.0", "ga@1.0.0", "richquotes@0.0.7", "edit-link@2.0.0"
+ "heading-anchors@1.0.3",
+ "ga@1.0.1",
+ "richquotes@0.0.9",
+ "github@2.0.0",
+ "language-picker",
+ "sidebar-ads",
+ "codeblock-label",
+ "sectionx-ex",
+ "collapsible-menu"
],
"pluginsConfig": {
"ga": {
"token": "UA-51680040-3"
},
- "richquotes" : {
- "default" : false
+ "richquotes": {
+ "default": false
+ },
+ "github": {
+ "url": "https://github.com/DjangoGirls/tutorial"
},
- "edit-link": {
- "base": "https://github.com/djangogirls/tutorial/edit/master",
- "label": "Edit This Page"
+ "language-picker": {
+ "grid-columns": 3
+ },
+ "sidebar-ads": {
+ "ads": [
+ {
+ "imageUrl": "https://djangogirls.org/static/img/global/donate/lagos.jpg",
+ "url": "https://surveys.jetbrains.com/s3/w-django-girls-survey-2024",
+ "description": "💖 Celebrate 10 years with us. Fill our survey! ✨",
+ "btnText": "Fill in now!"
+ },
+ {
+ "imageUrl": "https://static.djangoproject.com/img/logos/django-logo-negative.png",
+ "url": "https://www.djangoproject.com/",
+ "description": "💖 The DSF supports the development of Django! ✨",
+ "btnText": "Learn more!"
+ },
+ {
+ "imageUrl": "https://djangogirls.org/static/img/global/supporters/DO_Logo_Vertical_Blue.png",
+ "url": "https://www.digitalocean.com/",
+ "description": "💖 DigitalOcean simplifies cloud computing! ✨",
+ "btnText": "Learn more!"
+ },
+ {
+ "imageUrl": "https://djangogirls.org/uploads/uploads/posthog.png",
+ "url": "https://posthog.com/",
+ "description": "💖 PostHog offers a suite of product analysis tools! ✨",
+ "btnText": "Learn more!"
+ },
+ {
+ "imageUrl": "https://djangogirls.org/uploads/uploads/lincolnloop.png",
+ "url": "https://lincolnloop.com/",
+ "description": "💖 Lincoln Loop provides scalable content platforms! ✨",
+ "btnText": "Learn more!"
+ },
+ {
+ "imageUrl": "https://djangogirls.org/uploads/uploads/torchbox.png",
+ "url": "https://torchbox.com/",
+ "description": "💖 Torchbox, the creators of Wagtail! ✨",
+ "btnText": "Learn more!"
+ },
+ {
+ "imageUrl": "https://www.pythonanywhere.com/static/anywhere/images/PA-logo.svg",
+ "url": "https://www.pythonanywhere.com/",
+ "description": "💖 Host, run, and code Python in the cloud! ✨",
+ "btnText": "Learn more! "
+ },
+ {
+ "imageUrl": "https://djangogirls.org/static/img/global/donate/lagos.jpg",
+ "url": "https://www.patreon.com/djangogirls",
+ "description": "💖 Support our work and donate to our project! ✨",
+ "btnText": "Donate now!"
+ },
+ {
+ "imageUrl": "https://djangogirls.org/static/img/global/donate/tshirt.jpg",
+ "url": "https://djangogirls.org/en/contact/",
+ "description": "💖 Want to support our work? ✨",
+ "btnText": "Contact Us!"
+ }
+ ]
+ },
+ "sectionx": {
+ "tag": "b"
}
- },
-
- "gitbook": ">=2.5.2"
+ }
}
diff --git a/contributing/images/edit.png b/contributing/images/edit.png
index bd11fe1dc29..bd0bb646924 100644
Binary files a/contributing/images/edit.png and b/contributing/images/edit.png differ
diff --git a/contributing/images/fork.png b/contributing/images/fork.png
index 8d0cfb439c0..13e52e00097 100644
Binary files a/contributing/images/fork.png and b/contributing/images/fork.png differ
diff --git a/contributing/images/gitbook.png b/contributing/images/gitbook.png
index 666b4780081..460c2623f58 100644
Binary files a/contributing/images/gitbook.png and b/contributing/images/gitbook.png differ
diff --git a/contributing/images/github_editor.png b/contributing/images/github_editor.png
index 44af3a6de7b..653f747d491 100644
Binary files a/contributing/images/github_editor.png and b/contributing/images/github_editor.png differ
diff --git a/contributing/images/pull_request.png b/contributing/images/pull_request.png
index 7af36fe61be..0effe646f72 100644
Binary files a/contributing/images/pull_request.png and b/contributing/images/pull_request.png differ
diff --git a/crowdin.yaml b/crowdin.yaml
index 6034104a541..da45c696f2b 100644
--- a/crowdin.yaml
+++ b/crowdin.yaml
@@ -1,19 +1,3 @@
-project_identifier: django-girls-tutorial
-api_key: 2be4b1707d0745bc96e9a5c9ffb4ca9b
-base_path: /Users/olasitarska/Desktop/Events/Django Girls/tutorial
-
files:
- -
- source: "/en/**/*.md"
- translation: "/%two_letters_code%/%original_path%/%original_file_name%"
- ignore:
- - /_book
- - /node_modules
- - /CONTRIBUTING.md
- -
- source: "/en/*.md"
- translation: "/%two_letters_code%/%original_file_name%"
- ignore:
- - /_book
- - /node_modules
- - /CONTRIBUTING.md
+ - source: /en/**/*.md
+ translation: '/%locale%/**/%original_file_name%'
diff --git a/cs/GLOSSARY.md b/cs/GLOSSARY.md
new file mode 100755
index 00000000000..3107893bace
--- /dev/null
+++ b/cs/GLOSSARY.md
@@ -0,0 +1,3 @@
+# editor zdrojového kódu
+
+Editor kódu je aplikace, která umožňuje uložit váš kód, takže bude možné vrátit se k němu později. Kde ho můžeš získat se dozvíš v [Kapitole editor kódu](./code_editor/README.md).
\ No newline at end of file
diff --git a/cs/README.md b/cs/README.md
new file mode 100755
index 00000000000..5ad33b27ddd
--- /dev/null
+++ b/cs/README.md
@@ -0,0 +1,53 @@
+# Django Girls Tutoriál
+[](https://gitter.im/DjangoGirls/tutorial?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+
+> Tento návod je licencován pod Creative Commons Attribution-ShareAlike 4.0 mezinárodní licencí. Chcete-li zobrazit kopii této licence, navštivte https://creativecommons.org/licenses/by-sa/4.0/
+
+## Úvod
+
+Už jsi někdy měla pocit, že svět stále více a více používá technologie a ty zůstáváš nějak pozadu? Přemýšlela jsi někdy, jak vytvořit webové stránky, ale nikdy jsi neměla dostatek motivace začít? Přemýšlela jsi někdy, že svět softwaru je pro tebe příliš složitý na to, abys zkusila něco naprogramovat sama?
+
+Máme pro tebe dobrou zprávu! Programování není tak těžké, jak se zdá, a zde ti chceme ukázat, jak zábavné to může být.
+
+Tento návod tě magicky nepromění v programátora. Jestli chceš být dobrá programátorka, budeš potřebovat měsíce nebo dokonce roky učení a praxe. Ale chceme ti ukázat, že programování nebo tvorba webových stránek není tak složitá, jak se zdá. Budeme se snažit ti vysvětlit různé kousky a střípky tak jednoduše, jak dokážeme, aby ses necítila technologiemi zastrašena.
+
+Doufáme, že se nám podaří přiblížit ti tuto technologii tak, abys ji měla stejně ráda jako my!
+
+## Co se naučíš během kurzu?
+
+Po dokončení kurzu budeš mít jednoduchou, fungující webovou aplikaci: vlastní blog. Ukážeme ti, jak ho zprovoznit online tak, aby se ostatní mohli na tvoji práci podívat!
+
+Tvá aplikace bude (více či méně) vypadat takto:
+
+![Figure 0.1][2]
+
+ [2]: images/application.png
+
+> Pokud budeš procházet kurz sama bez učitele, který ti by ti pomáhal v případě, že narazíš na nějaký problém, máme pro tebe chat: [](https://gitter.im/DjangoGirls/tutorial?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge). Požádali jsme kouče a předchozí účastníky kurzu, aby čas od času pomáhali ostatním s tímto kurzem. Neboj se zde zeptat na jakoukoliv otázku!
+
+OK, [začněme od začátku...][3]
+
+ [3]: ./how_the_internet_works/README.md
+
+## O kurzu a přispěvatelích
+
+Tento kurz je provozován organizací [DjangoGirls][4]. Pokud najdeš nějaké chyby, nebo chceš aktualizovat návod, prosím, [postupuj podle pokynů pro přispívající][5].
+
+ [4]: https://djangogirls.org/
+ [5]: https://github.com/DjangoGirls/tutorial/blob/master/README.md
+
+## Český překlad
+
+Původní DjangoGirls tutoriál přeložila do češtiny skupina dobrovolníků. Poděkování patří hlavně:
+Davidovi (dakf), Kristýně Kumpánové, Veronice Gabrielové, Tomáši Ehrlichovi,
+Aničce Jaegerové, Matějovi Stuchlíkovi, Filipovi Sivákovi a Juraji M. Bezručkovi.
+
+## Chtěla bys nám pomoci přeložit návod do jiných jazyků?
+
+V současné době jsou překlady provozovány na platformě crowdin.com na adrese:
+
+https://crowdin.com/project/django-girls-tutorial
+
+Pokud tvůj jazyk není uveden v seznamu na crowdin, prosím, [založ nový požadavek][6] pro přidání dalšího jazyka.
+
+ [6]: https://github.com/DjangoGirls/tutorial/issues/new
diff --git a/cs/SUMMARY.md b/cs/SUMMARY.md
new file mode 100755
index 00000000000..44793ad9d19
--- /dev/null
+++ b/cs/SUMMARY.md
@@ -0,0 +1,26 @@
+# Shrnutí
+
+* [Úvod](README.md)
+* [Instalace](installation/README.md)
+* [Jak funguje internet](how_the_internet_works/README.md)
+* [Úvod do příkazové řádky](intro_to_command_line/README.md)
+* [Instalace Pythonu](python_installation/README.md)
+* [Editor zdrojového kódu](code_editor/README.md)
+* [Úvod do Pythonu](python_introduction/README.md)
+* [Co je Django?](django/README.md)
+* [Instalace Django](django_installation/README.md)
+* [Tvůj první Django projekt!](django_start_project/README.md)
+* [Django modely](django_models/README.md)
+* [Django admin](django_admin/README.md)
+* [Nasazení!](deploy/README.md)
+* [Django URL](django_urls/README.md)
+* [Django views -- je čas začít tvořit!](django_views/README.md)
+* [Úvod do HTML](html/README.md)
+* [Django ORM (tvorba dotazů)](django_orm/README.md)
+* [Dynamická data v šablonách](dynamic_data_in_templates/README.md)
+* [Django šablony](django_templates/README.md)
+* [CSS - udělejte svou aplikaci hezčí](css/README.md)
+* [Rozšíření šablon](template_extending/README.md)
+* [Rozšíření vaší aplikace](extend_your_application/README.md)
+* [Django formuláře](django_forms/README.md)
+* [Co dál?](whats_next/README.md)
diff --git a/cs/code_editor/README.md b/cs/code_editor/README.md
new file mode 100755
index 00000000000..f91d7968087
--- /dev/null
+++ b/cs/code_editor/README.md
@@ -0,0 +1,7 @@
+# Editor zdrojového kódu
+
+Právě se chystáš napsat svůj první řádek kódu, takže je čas sáhnout po editoru kódu!
+
+> **Poznámka** Mohla jsi to udělat už dříve v kapitole o instalaci - jestli je to tak, prostě jen tuhle kapitolu přeskoč a vrhni se na další!
+
+{% include "/code_editor/instructions.md" %}
\ No newline at end of file
diff --git a/cs/code_editor/instructions.md b/cs/code_editor/instructions.md
new file mode 100755
index 00000000000..a43563481a1
--- /dev/null
+++ b/cs/code_editor/instructions.md
@@ -0,0 +1,31 @@
+Existuje mnoho různých editorů a z velké části se výběr scvrkává na osobní preference. Většina programátorům v Pythonu používá složité, ale mimořádně mocné IDE (integrovaná vývojová prostředí), například PyCharm. Pro začátečníka to může být pravděpodobně méně vhodné; naše doporučení jsou stejně mocná, ale mnohem jednodušší.
+
+Naše návrhy jsou napsané níže, ale neváhejte se zeptat svého kouče, jaké jsou jeho preference - poté bude i jednodušší získat od něj pomoc s prací v editoru.
+
+## Gedit
+
+Gedit je open-source editor. Je k dispozici zdarma pro všechny operační systémy.
+
+[Stáhnout si jej můžeš zde](https://wiki.gnome.org/Apps/Gedit#Download)
+
+## Sublime Text
+
+Sublime Text je velmi oblíbený editor s bezplatnou zkušební dobou. Lze jej snadno nainstalovat a používat. Je k dispozici pro všechny operační systémy.
+
+[Stáhnout si jej můžeš zde](https://www.sublimetext.com/)
+
+## Atom
+
+Atom je velmi nový editor kódu vytvořen [GitHub](https://github.com/)em. Je zdarma, je open-source a má snadnou instalaci a snadné použití. Je k dispozici pro Windows, macOS a Linux.
+
+[Stáhnout si jej můžeš zde](https://atom.io/)
+
+## Proč jsme instalovali editor kódu?
+
+Možná přemýšlíš, proč instalujeme speciální editor kódu a proč raději nezvolíme něco jako Notepad nebo Word.
+
+První důvod je, že kód musí být **prostý text** a programy jako Word a Textedit ve skutečnosti produkují bohatý text (s fonty a formátováním), používají vlastní formáty jako [RTF (Rich Text Format)](https://en.wikipedia.org/wiki/Rich_Text_Format).
+
+Druhým důvodem je, že editory kódu se specializují na editaci kódu, takže mohou poskytovat užitečné funkce, jako je barevné zvýraznění kódu podle jeho významu nebo automatické ukončování uvozovek apod.
+
+Vše to uvidíme v akci později. Brzy ti přijde tvůj oblíbený editor kódu jako jeden z tvých nejlepších nástrojů :)
diff --git a/cs/css/README.md b/cs/css/README.md
new file mode 100755
index 00000000000..acc0961ec20
--- /dev/null
+++ b/cs/css/README.md
@@ -0,0 +1,297 @@
+# CSS - aby byla tvoje aplikace krásná!
+
+Náš blog nevypadá stále dost pěkně, že? Je na čase ho udělat hezčí! Použijeme na to CSS.
+
+## Co je to CSS?
+
+CSS (neboli Cascading Style Sheets) je jazyk používaný pro popis vzhledu a formátování webové stránky. Je to značkovací jazyk (jako HTML). Ber ho jako make-up pro náš web ;).
+
+Nechceme ale zase začínat úplně od začátku, že? Opět použijeme něco, co již bylo vytvořeno jinými programátory a sdíleno zdarma na internetu. Vymýšlet znovu, co již před námi někdo vymyslel, to by nebyla žádná legrace.
+
+## Použijme Bootstrap!
+
+Bootstrap je jedním z nejpopulárnějších HTML a CSS frameworků pro vývoj pěkné webové stránky: https://getbootstrap.com/
+
+Napsali ho programátoři, kteří pracovali pro Twitter, a nyní ho vyvíjí dobrovolníci z celého světa.
+
+## Instalace Bootstrapu
+
+Chceš-li nainstalovat Bootstrap, je třeba přidat do `< head >` v souboru `.html` (`blog/templates/blog/post_list.html`):
+
+```html
+
+
+```
+
+To nepřidá žádné soubory do projektu. Jen to odkazuje na soubory, které existují na internetu. Jen do toho, otevři tvůj web a aktualizuj stránku. Hurá!
+
+![Obrázek 14.1][1]
+
+ [1]: images/bootstrap1.png
+
+Hned to vypadá lépe!
+
+## Statické soubory v Djangu
+
+Konečně se podíváme zblízka na téma, které jsme již zmínili, **statické soubory**. Statické soubory jsou všechny naše CSS soubory a obrázky, které nejsou dynamické, takže jejich obsah není závislý na kontextu požadavku a budou pro každého uživatele stejné.
+
+### Kam umístit statické soubory pro Django
+
+Jak jsi viděla, když jsme spustili `collectstatic` na serveru, Django už ví, kde najít statické soubory pro vestavěnou aplikaci "admin". Teď jen musíme přidat nějaké statické soubory pro vlastní aplikaci, `blog`.
+
+Uděláš to tak, že vytvoříš složku s názvem `static` uvnitř aplikace blog:
+
+```
+djangogirls
+├── blog
+│ ├── migrations
+│ ├── static
+│ └── templates
+└── mysite
+```
+
+Django automaticky najde všechny složky s názvem "static" uvnitř vašich složek aplikací a bude moci využívat jejich obsah jako statické soubory.
+
+## Tvůj první soubor CSS!
+
+Pokud chceš na webovou stránku přidat svůj vlastní styl, vytvoř css soubor. Vytvoř nový adresář s názvem `css` uvnitř adresáře `static`. Vytvoř nový soubor s názvem `blog.css` uvnitř tohoto adresáře `css`. Připraveno?
+
+```
+djangogirls
+└─── blog
+ └─── static
+ └─── css
+ └─── blog.css
+```
+
+Čas napsat nějaké CSS! Otevři soubor `blog/static/css/blog.css` v editoru kódu.
+
+Nepůjdeme příliš hluboko do tématu přizpůsobení webu a učení o CSS, protože je to docela snadné a můžeš se o tom naučit více sama po tomto workshopu. Opravdu můžeme doporučit [Codeacademy HTML & CSS kurz][2], kde se dozvíš vše, co potřebuješ vědět, aby tvoje stránky s CSS vypadaly dobře.
+
+ [2]: https://www.codecademy.com/tracks/web
+
+Ale pojďme něco málo udělat. Co třeba změnit barvu našeho záhlaví? Pro interpretaci barev počítače používají speciální kódy. Začínají `#` a následuje 6 písmen (A-F) a číslic (0-9). Kódy barev můžeš najít například zde: http://www.colorpicker.com/. Můžeš také použít [předdefinované barvy][3], `červená/red` a `zelená/green`.
+
+ [3]: http://www.w3schools.com/cssref/css_colornames.asp
+
+V souboru `blog/static/css/blog.css` přidej následující kód:
+
+```css
+h1 a {
+ color: #FCA205;
+}
+```
+
+`h1` je CSS selector. To znamená, že budeme aplikovat naše styly na jakýkoliv `a` element uvnitř `h1` (např. když máme v kódu něco jako: `< h1 > odkaz < /a >< / h1 >`). V takovém případě sdělujeme, že barvu elementu měníme na `#FCA205`, což je oranžová. Samozřejmě sem můžeš vložit vlastní barvu!
+
+V CSS souboru určujeme styly pro prvky v souboru HTML. Prvky jsou identifikovány pomocí názvu prvku (tj, `a`,`h1`, `body`), atributem `class` nebo atributem `id`. Třídy/Class a id jsou jména, která pojmenovávají samotný prvek. Třídy definují skupiny prvků a id poukazují na konkrétní prvky. Například následující tag může identifikovat pomocí CSS tag `a`, třídu `external_link` nebo id `link_to_wiki_page`:
+
+```html
+
+```
+
+Přečti si o [CSS selektorech ve w3schools][4].
+
+ [4]: http://www.w3schools.com/cssref/css_selectors.asp
+
+Pak je třeba také říct naší HTML šabloně, že jsme přidali nějaké CSS. Otevři soubor `blog/templates/blog/post_list.html` a přidej tento řádek na samý začátek:
+
+```html
+{% load staticfiles %}
+```
+
+Právě nahráváme statické soubory :). Pak mezi `< head >` a `< / head >` za odkazy na soubory Bootstrap CSS (prohlížeč načte soubory v pořadí, ve kterém jsou zapsány, takže kód v našem souboru může přepsat kód v Bootstrap souborech) přidejte tento řádek:
+
+```html
+
+```
+
+Právě jsi řekla naší šabloně, kde je umístěn náš soubor CSS.
+
+Soubor by měl nyní vypadat takto:
+
+```html
+{% load staticfiles %}
+
+
+ Django Girls blog
+
+
+
+
+
+
+ {% endfor %}
+
+
+```
+
+OK, ulož soubor a aktualizuj stránky!
+
+![Obrázek 14.2][5]
+
+ [5]: images/color2.png
+
+Dobrá práce! Co kdybychom také chtěli provzdušnit náš web a zvětšit okraj na levé straně? Pojďme to zkusit!
+
+```css
+body {
+ padding-left: 15px;
+}
+```
+
+Přidej toto do svého CSS souboru, ulož soubor a koukni se, jak to funguje!
+
+![Obrázek 14.3][6]
+
+ [6]: images/margin2.png
+
+Možná můžeme také chtít přizpůsobit písmo v našem záhlaví. Vlož za tag `< head >` v souboru `blog/templates/blog/post_list.html`:
+
+```html
+
+```
+
+Tento řádek bude importovat písmo s názvem *Lobster* z Google písem (https://www.google.com/fonts).
+
+Nyní přidej řádek `font-family: "Lobster";` do CSS souboru `blog/static/css/blog.css` uvnitř deklarace `h1` bloku (kód mezi závorkami `{` a `}`) a aktualizuj stránky:
+
+```css
+h1 a {
+ color: #FCA205;
+ font-family: 'Lobster';
+}
+```
+
+![Obrázek 14.3][7]
+
+ [7]: images/font.png
+
+Skvěle!
+
+Jak jsme si řekli výše, CSS má koncept tříd, který v podstatě umožňuje pojmenovat části kódu HTML a styly aplikovat pouze na tyto části bez ovlivnění ostatních částí. Je to zvlášť užitečné, pokud máš dva div tagy, ale každý dělá něco jiného (jako záhlaví a příspěvek), takže nechceš, aby vypadaly stejně.
+
+Pokračuj a pojmenuj některé části kódu HTML. Přidáš třídu s názvem `page-header` do tvého `div` tagu, který obsahuje záhlaví, jako je tento:
+
+```html
+
+```
+
+Tyto soubory ulož a aktualizuj své webové stránky.
+
+![Obrázek 14.4][8]
+
+ [8]: images/final.png
+
+Woohoo! Vypadá to super, ne? Kód, který jsme vložili, opravdu není tak těžké pochopit. Měla bys být schopna pochopit většinu z něj jen jeho čtením.
+
+Neobávej se trochu poupravit CSS a pokusit se změnit některé věci. Když něco rozbiješ, můžeš to vždy vrátit zpět!
+
+Mimochodem opravdu doporučujeme tento bezplatný online [Codeacademy HTML & CSS kurz][2] jako post-workshop úkol, naučíš se vše, co potřebuješ vědět, aby tvoje stránky byly díky CSS hezčí.
+
+Připravena na další kapitolu?! :)
diff --git a/cs/css/images/bootstrap1.png b/cs/css/images/bootstrap1.png
new file mode 100644
index 00000000000..bd81cd14373
Binary files /dev/null and b/cs/css/images/bootstrap1.png differ
diff --git a/cs/css/images/color2.png b/cs/css/images/color2.png
new file mode 100644
index 00000000000..3f82e7d3922
Binary files /dev/null and b/cs/css/images/color2.png differ
diff --git a/cs/css/images/final.png b/cs/css/images/final.png
new file mode 100644
index 00000000000..067c83d36cc
Binary files /dev/null and b/cs/css/images/final.png differ
diff --git a/cs/css/images/font.png b/cs/css/images/font.png
new file mode 100644
index 00000000000..310f9e85f18
Binary files /dev/null and b/cs/css/images/font.png differ
diff --git a/cs/css/images/margin2.png b/cs/css/images/margin2.png
new file mode 100644
index 00000000000..895828b688d
Binary files /dev/null and b/cs/css/images/margin2.png differ
diff --git a/cs/deploy/README.md b/cs/deploy/README.md
new file mode 100755
index 00000000000..6c4d08eaadf
--- /dev/null
+++ b/cs/deploy/README.md
@@ -0,0 +1,317 @@
+# Nasazení!
+
+> **Poznámka:** Projít následující kapitolu může být někdy trochu těžké. Vydrž a dokonči to; nasazení je důležitou součástí procesu vývoje webových stránek. Tato kapitola je umístěna uprostřed kurzu, aby ti tvůj kouč mohl pomoci s mírně složitějším procesem nasazení tvého webu online. To znamená, že stále můžeš dokončit kurz později sama, pokud to nestihneš teď.
+
+Až dosud byly tvoje webové stránky k dispozici pouze ve tvém počítači, nyní se naučíš je nasadit! Nasazení je proces publikování aplikace na internetu, takže si lidé konečně mohou prohlédnout tvou webovou aplikaci :).
+
+Jak jsi se dozvěděla, webové stránky musí být umístěny na serveru. Na internetu existuje mnoho poskytovatelů serverů. My budeme používat jednoho, který má relativně jednoduchý proces nasazení: [PythonAnywhere][1]. PythonAnywhere je zdarma pro malé aplikace, které nemají příliš mnoho návštěvníků, takže to pro tebe bude teď stačit.
+
+ [1]: https://www.pythonanywhere.com/
+
+Další externí službu, kterou budeme používat, je [GitHub][2], což je hostingová služba pro zdrojové kódy. Na internetu existují i jiné služby, ale téměř všichni programátoři mají účet na GitHubu. Nyní ho budeš mít také!
+
+ [2]: https://www.github.com
+
+Budeme používat GitHub jako odrazový můstek k přesunu našeho kódu do a z PythonAnywhere.
+
+# Git
+
+Git je "systém pro správu verzí" používaný spoustou programátorů. Tento software může sledovat změny v souborech v průběhu času tak, že konkrétní verze můžeš později znovu zobrazit. Trochu jako funkce "sledování změn" v aplikaci Microsoft Word, ale mnohem mocnější.
+
+## Instalace Git
+
+> **Poznámka:** Pokud jsi již prošla instalační kroky, není třeba se k tomu vracet - můžeš přeskočit k další části a začít vytvářet Git repozitář.
+
+{% include "/deploy/install_git.md" %}
+
+## Spuštění Git repositáře
+
+Git sleduje změny v sadě souborů v takzvaném úložišti kódu/repository (nebo zkráceně "repo"). Založme si jedno repo pro náš projekt. Otevři konzoli a v `djangogirls` adresáři spusť tyto příkazy:
+
+> **Poznámka:** Zkontroluj si svůj aktuální pracovní adresář pomocí `pwd` (macOS/Linux) nebo příkazem `cd` (Windows) před inicializací úložiště. Měla bys být ve složce `djangogirls`.
+
+```
+$ git init
+ Initialized empty Git repository in ~/djangogirls/.git/
+$ git config --global user.name "Your Name"
+$ git config --global user.email you@example.com
+```
+
+Inicializace úložiště git je něco, co musíme udělat jednou za projekt (a nebudeš muset znovu zadávat uživatelské jméno a e-mailovou adresu).
+
+Git bude sledovat změny souborů a složek v tomto adresáři, ale jsou tam některé soubory, které chceme ignorovat. Uděláme to tak, že vytvoříš soubor s názvem `.gitignore` v základním adresáři. Otevři editor a vytvoř nový soubor s následujícím obsahem:
+
+```
+*.pyc
+__pycache__
+myvenv
+db.sqlite3
+.DS_Store
+```
+
+A ulož ho jako `.gitignore` ve složce nejvyšší úrovně "djangogirls".
+
+> **Poznámka:** Tečka na začátku názvu souboru je důležitá! Pokud budeš mít jakékoliv potíže s vytvořením (například Mac nerad vytváří soubory, které začínají tečkou, přes Finder), tak použij funkci "Uložit jako" v editoru, což je neprůstřelné.
+
+Je vhodné použít příkaz `git status` před použitím příkazu `git add`, anebo vždy, když si nejsi jistá, co se změnilo. To pomůže předejít jakýmkoliv překvapením, například přidání nesprávných souborů. Příkaz `git status` vrátí informace o všech souborech nesledovaných (untracked), upravených (modified) a připravených ke commitu (staged), stav větve a mnoho dalšího. Výstup by měl být podobný tomuto:
+
+```
+$ git status
+ On branch master
+
+ No commits yet
+
+Untracked files:
+ (use "git add ..." to include in what will be committed)
+ .gitignore
+ blog/
+ manage.py
+ mysite/
+
+ nothing added to commit but untracked files present (use "git add" to track)
+```
+
+A nakonec uložíme naše změny. Přejdi do konzole a spusť tyto příkazy:
+
+```
+$ git add --all .
+$ git commit -m "My Django Girls app, first commit"
+[...]
+13 files changed, 200 insertions(+)
+ create mode 100644 .gitignore
+[...]
+create mode 100644 mysite/wsgi.py
+```
+
+## Přenesení našeho kódu na GitHub
+
+Přejdi na [GitHub.com][2] a zaregistruj si zdarma nový uživatelský účet. (Pokud jsi to již dříve ve workshopu udělala, tak je to skvělé!)
+
+Potom vytvoř nové úložiště, dej mu název "my-first-blog". Ponech zaškrtávací políčko "initialise with a README" nezaškrtlé, ponechej prázdnou možnost .gitignore (to už jsme udělaly ručně) a ponech licenci jako None.
+
+![][3]
+
+ [3]: images/new_github_repo.png
+
+> **Poznámka:** Název `my-first-blog` je důležitý – mohla by sis vybrat něco jiného, ale použijeme ho ještě mnohokrát později a musela bys ho pokaždé nahrazovat. Tak je zatím snazší se držet názvu `my-first-blog`.
+
+Na další obrazovce se zobrazí klon URL tvého repo. Zvol verzi "HTTPS", zkopíruj ji a za chvilku ji použijeme v terminálu:
+
+![][4]
+
+ [4]: images/github_get_repo_url_screenshot.png
+
+Teď potřebujeme spojit úložiště Git na tvém počítači s úložištěm na GitHub.
+
+Zadej následující příkaz do konzole (nahraď `< your-github-username >` uživatelským jménem, které jsi zadala, když jsi vytvořila svůj účet na GitHub, ale bez ostrých závorek):
+
+```
+$ git remote add origin https://github.com//my-first-blog.git
+$ git push -u origin master
+```
+
+Zadej své uživatelské jméno a heslo pro GitHub a měla bys vidět něco takového:
+
+```
+Username for 'https://github.com': hjwp
+Password for 'https://hjwp@github.com':
+Counting objects: 6, done.
+Writing objects: 100% (6/6), 200 bytes | 0 bytes/s, done.
+Total 3 (delta 0), reused 0 (delta 0)
+To https://github.com/hjwp/my-first-blog.git
+* [new branch] master -> master
+Branch master set up to track remote branch master from origin.
+```
+
+
+
+Tvůj kód je nyní na GitHubu. Můžeš se na něj jít podívat! Zjistíš, že je v dobré společnosti - [Django][5], [Django girls tutorial][6] a mnoha dalších velkých open source software projektů, které také hostí svůj kód na GitHubu :)
+
+ [5]: https://github.com/django/django
+ [6]: https://github.com/DjangoGirls/tutorial
+
+# Vytvoření našeho blogu na PythonAnywhere
+
+> **Poznámka:** Možná, že jsi vytvořila účet PythonAnywhere již dříve během instalačních kroků - pokud ano, nemusíš to nyní dělat znovu.
+
+{% include "/deploy/signup_pythonanywhere.md" %}
+
+## Natáhnutí našeho kódu na PythonAnywhere
+
+Jakmile se zaregistruješ na PythonAnywhere, budeš přesměrována na dashboard nebo na stránku "Konzole". Zvol možnost spustit konzoli "Bash" – je to PythonAnywhere verze konzole, stejná jako na tvém počítači.
+
+> **Poznámka:** PythonAnywhere je založen na Linuxu, takže pokud jsi na Windows, konzole bude vypadat trochu jinak, než ta, která je na tvém počítači.
+
+Pojďme natáhnout náš kód z GitHubu na PythonAnywhere vytvořením "klonu" našeho repo. Zadej následující příkaz do konzole na PythonAnywhere (nezapomeň používat GitHub uživatelské jméno namísto ``):
+
+```
+ $ git clone https://github.com//my-first-blog.git
+```
+
+Tento příkaz nahraje kopii tvého kódu na PythonAnywhere. Zkontroluj to zadáním `tree my-first-blog`:
+
+```
+$ tree my-first-blog
+my-first-blog/
+├── blog
+│ ├── __init__.py
+│ ├── admin.py
+│ ├── migrations
+│ │ ├── 0001_initial.py
+│ │ └── __init__.py
+│ ├── models.py
+│ ├── tests.py
+│ └── views.py
+├── manage.py
+└── mysite
+ ├── __init__.py
+ ├── settings.py
+ ├── urls.py
+ └── wsgi.py
+```
+
+### Vytvoření virtualenv na PythonAnywhere
+
+Stejně jako na tvém počítači můžeš na PythonAnywhere vytvořit virtualenv. V Bash konzoli zadej postupně následující příkazy:
+
+```
+$ cd my-first-blog
+
+$ virtualenv --python=python3.4 myvenv
+Running virtualenv with interpreter /usr/bin/python3.4
+[...]
+Installing setuptools, pip...done.
+
+$ source myvenv/bin/activate
+
+(mvenv) $ pip install django whitenoise
+Collecting django
+[...]
+Successfully installed django-1.8.2 whitenoise-2.0
+```
+
+> **Poznámka:** Krok `pip install` může trvat několik minut. Trpělivost, trpělivost! Ale pokud to trvá déle než 5 minut, něco není v pořádku. Zeptej se svého kouče.
+
+
+
+### Shromažďování statických souborů
+
+Byla jsi zvědavá, co bylo to "whitenoise" vlastně zač? Je to nástroj pro obsluhu takzvaných "statických souborů". Statické soubory jsou soubory, které se pravidelně nemění nebo nespouštějí programový kód, například soubory HTML nebo CSS. Na serverech fungují odlišně než na tvém osobním počítači a proto potřebujeme nástroj jako "whitenoise" k jejich obsloužení.
+
+O statických souborech zjistíme trochu více později v tomto kurzu, až budeme upravovat CSS pro naše stránky.
+
+Nyní jen musíme spustit další příkaz na serveru s názvem `collectstatic`. Ten řekne Djangu, aby posbíral všechny statické soubory, které potřebuje na serveru. V současnosti jsou to hlavně soubory, které upravují vzhled admin stránky.
+
+```
+(mvenv) $ python manage.py collectstatic
+
+You have requested to collect static files at the destination
+location as specified in your settings:
+ /home/edith/my-first-blog/static
+
+This will overwrite existing files!
+Are you sure you want to do this?
+
+Type 'yes' to continue, or 'no' to cancel: yes
+```
+
+Zadej "yes" a pokračujeme! Také máš ráda, když ti počítač začne vypisovat ty dlouhé stránky kódu? Já jsem to vždy doprovázela tichými zvuky. Brp, brp, brp...
+
+```
+Copying '/home/edith/my-first-blog/mvenv/lib/python3.4/site-packages/django/contrib/admin/static/admin/js/actions.min.js' Copying '/home/edith/my-first-blog/mvenv/lib/python3.4/site-packages/django/contrib/admin/static/admin/js/inlines.min.js' [...] Copying '/home/edith/my-first-blog/mvenv/lib/python3.4/site-packages/django/contrib/admin/static/admin/css/changelists.css' Copying '/home/edith/my-first-blog/mvenv/lib/python3.4/site-packages/django/contrib/admin/static/admin/css/base.css' 62 static files copied to '/home/edith/my-first-blog/static'.
+```
+
+### Vytvoření databáze na PythonAnywhere
+
+Zde je další věc, která se liší mezi tvým počítačem a serverem: server používá jinou databázi. Takže uživatelské účty a příspěvky mohou být jiné na serveru a na tvém počítači.
+
+Můžeme inicializovat databázi na serveru, stejně jako jsi to udělala v počítači, pomocí příkazů `migrate` a `createsuperuser`:
+
+```
+(mvenv) $ python manage.py migrate
+Operations to perform:
+[...]
+ Applying sessions.0001_initial... OK
+
+
+(mvenv) $ python manage.py createsuperuser
+```
+
+## Publikování našeho blogu jako webové aplikace
+
+Nyní je náš kód na PythonAnywhere a náš virtualenv je připraven, statické soubory jsou shromážděny a databáze inicializována. Jsme připraveni zveřejnit blog jako webovou aplikaci!
+
+Běž zpět na dashboard PythonAnywhere kliknutím na logo a poté klikni na kartu **Web**. Nakonec klikni na **Add a new web app**.
+
+Po potvrzení tvého názvu domény zvol **manual configuration** (NB *není* "Django" volba) v dialogovém okně. Dále zvol **Python 3.4** a klepni na tlačítko Next pro dokončení průvodce.
+
+> **Poznámka:** Ujisti se, že volíš možnost "Manual configuration", nikoliv "Django". Jsme příliš cool na to, abychom používali výchozí nastavení PythonAnywhere Django ;-)
+
+### Nastavení virtualenv
+
+Budeš přesměrována na PythonAnywhere konfigurační obrazovku pro tvou webovou aplikaci, sem budeš muset jít pokaždé, když budeš chtít provést změny aplikace na serveru.
+
+![][7]
+
+ [7]: images/pythonanywhere_web_tab_virtualenv.png
+
+V části "Virtualenv" klepni na červený text, který říká "Enter the path to a virtualenv" a zadej: `/home/ /my-first-blog/myvenv/`. Klikni na modré zaškrtávací políčko, čímž uložíš cestu předtím, než budeš pokračovat.
+
+> **Poznámka:** Nahraď své vlastní uživatelské jméno podle potřeby. Pokud uděláš chybu, PythonAnywhere Ti zobrazí malé varování.
+
+### Konfigurace souboru WSGI
+
+Django používá "WSGI protokol", standard pro obsluhu webových stránek pomocí Pythonu, který PythonAnywhere podporuje. Aby PythonAnywhere poznal a mohl používat náš Django blog, upravme WSGI konfigurační soubor.
+
+Klikni na odkaz "WSGI configuration file" (v sekci "Code" v horní části stránky – bude pojmenována nějak takto `/var/www/_pythonanywhere_com_wsgi.py`) a budeš přesměrována do editoru.
+
+Odstraň veškerý obsah a nahraď jej upraveným následujícím kódem:
+
+```python
+import os
+import sys
+
+path = '/home//my-first-blog' # use your own username here
+if path not in sys.path:
+ sys.path.append(path)
+
+os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
+
+from django.core.wsgi import get_wsgi_application
+from whitenoise.django import DjangoWhiteNoise
+application = DjangoWhiteNoise(get_wsgi_application())
+```
+
+> **Poznámka:** Nezapomeň nahradit své vlastní uživatelské jméno za ``
+
+Úkolem tohoto souboru je říct PythonAnywhere, kde je naše webová aplikace a jaký je název souboru nastavení Djanga. Také nastavuje nástroj pro statické soubory "whitenoise".
+
+Klikni na **Save** a přejdi zpět na kartu **Web**.
+
+Zvládly jsme to! Klikni na velké zelené tlačítko **Reload**, čímž zobrazíš svou aplikaci. Odkaz na to najdeš v horní části stránky.
+
+## Ladící tipy
+
+Pokud se ti zobrazí chyba při pokusu zobrazit web, první místo, kam se podívat na nějaké informace o ladění, je v **error log**. Odkaz na něj najdeš na PythonAnywhere v [kartě Web][8]. Zkontroluj, jestli tam nejsou nějaké chybové zprávy; nejnovější záznamy jsou na konci. Mezi běžné problémy patří:
+
+ [8]: https://www.pythonanywhere.com/web_app_setup/
+
+* Často zapomínané kroky jsou ty, které jsme dělaly v konzoly: vytvoření virtualenv, aktivace, instalace Djanga, spuštění collectstatic, přenesení databáze.
+
+* Chyba k cestě virtualenv na kartě Web – bude obvykle označená malou červenou zprávou na stejném místě.
+
+* Chyba v konfiguračním souboru WSGI – máš cestu do složky my-first-blog v pořádku?
+
+* Vybrala jsi stejnou verzi Pythonu pro svůj virtualenv stejně jako pro svoji webovou aplikaci? Obe verze by měly být 3.4.
+
+* Existují některé [obecné tipy ladění na PythonAnywhere wiki][9].
+
+ [9]: https://www.pythonanywhere.com/wiki/DebuggingImportError
+
+A pamatuj si, že tvůj kouč je tady, aby ti pomohl!
+
+# Jsme online!
+
+Výchozí stránka tvé webové aplikace by měla ukázat "Welcome to Django", stejně jako to dělá na tvém počítači. Zkus přidat `/admin/` na konec adresy URL a budeš přesměrována na admin stránku. Přihlas se pomocí uživatelského jména a hesla a uvidíš, že můžeš přidávat nové příspěvky na server.
+
+Poplácej sama sebe *po zádech*! Nasazení serveru je jednou z nejsložitější částí vývoje webových aplikací a trvá lidem často i několik dní, než je funkční. Ale ty máš své stránky online na internetu už teď!
diff --git a/cs/deploy/images/github_get_repo_url_screenshot.png b/cs/deploy/images/github_get_repo_url_screenshot.png
new file mode 100644
index 00000000000..ee1560b1e85
Binary files /dev/null and b/cs/deploy/images/github_get_repo_url_screenshot.png differ
diff --git a/cs/deploy/images/new_github_repo.png b/cs/deploy/images/new_github_repo.png
new file mode 100644
index 00000000000..d1f82e5d863
Binary files /dev/null and b/cs/deploy/images/new_github_repo.png differ
diff --git a/cs/deploy/images/pythonanywhere_web_tab_virtualenv.png b/cs/deploy/images/pythonanywhere_web_tab_virtualenv.png
new file mode 100644
index 00000000000..6069f6da831
Binary files /dev/null and b/cs/deploy/images/pythonanywhere_web_tab_virtualenv.png differ
diff --git a/cs/deploy/install_git.md b/cs/deploy/install_git.md
new file mode 100755
index 00000000000..0e9d9d7c282
--- /dev/null
+++ b/cs/deploy/install_git.md
@@ -0,0 +1,19 @@
+### Windows
+
+Git si můžeš stáhnout z [git-scm.com](https://git-scm.com/). Klikej na "další" ve všech krocích s výjimkou 5. kroku s názvem "Nastavení prostředí PATH", zvol "Spustit Git a související Unixové nástroje z příkazového řádku systému Windows" (spodní možnost). Ostatní výchozí hodnoty jsou v pořádku. Odškrtni Windows-style konce řádků, pro commit je Unixový styl konce řádků správný.
+
+### MacOS
+
+Stáhni Git z [git-scm.com](https://git-scm.com/) a postupuj podle pokynů.
+
+### Linux
+
+Pokud ho již nemáš nainstalovaný, git měl by být k dispozici pomocí Správce balíčků, zkus:
+
+```
+sudo apt install git
+# or
+sudo yum install git
+# or
+sudo zypper install git
+```
diff --git a/cs/deploy/signup_pythonanywhere.md b/cs/deploy/signup_pythonanywhere.md
new file mode 100755
index 00000000000..fe6e67a8fe7
--- /dev/null
+++ b/cs/deploy/signup_pythonanywhere.md
@@ -0,0 +1,5 @@
+Dále je čas přihlásit se zdarma k účtu "Beginner" na PythonAnywhere.
+
+ * [www.pythonanywhere.com](https://www.pythonanywhere.com/)
+
+> **Poznámka:** Při výběru svého uživatelského jména měj na paměti, že adresa URL tvého blogu bude mít tvar `yourusername.pythonanywhere.com`, takže si pro svůj blog zvol vlastní přezdívku nebo jiné jméno.
diff --git a/cs/django/README.md b/cs/django/README.md
new file mode 100755
index 00000000000..3663ae96264
--- /dev/null
+++ b/cs/django/README.md
@@ -0,0 +1,27 @@
+# Co je Django?
+
+Django (*jang-goh/ˈdʒæŋɡoʊ /*) je svobodný a open source webový aplikační framework napsaný v Pythonu. Webový framework je sada komponent, která pomáhá vyvíjet webové stránky rychleji a snadněji.
+
+Když vytváříš webové stránky, vždy potřebuješ podobnou sadu komponent: způsob, jak zpracovat ověření uživatele (registraci, přihlášení, odhlášení), administrační panel pro tvé webové stránky, formuláře, způsob, jak nahrávat soubory, atd.
+
+Naštěstí si ostatní lidé již dávno všimli, že vývojáři čelí stejným problémům při vytváření nových stránek. Takže se spojili a vytvořili frameworky (Django je jedním z nich), které obsahují sadu hotových, snadno použitelných komponent.
+
+Frameworky existují, aby ti ušetřily čas a ty jsi nemusela znovu vynalézat, co už někdo zdlouhavě vymýšlel. Stejně tak by ti měly ušetřit čas při vytváření nových webových stránek.
+
+## Proč potřebuješ framework?
+
+Abychom pochopili, co ve skutečnosti Django je, musíme se blíže podívat na to, co dělá server. První věcí je, že server musí vědět, že chceš obsloužit tebou zvolenou webovou stránkou.
+
+Představ si poštovní schránku (port), která na zvoleném portu sleduje příchozí zprávy (požadavky). Podobně se chová webový server. Webový server čte požadavky od uživatele a odešle odpověď v podobě webové stránky. Ale když chceš něco poslat, musíš mít nějaký obsah. A Django je to, co ti pomůže vytvořit tento obsah.
+
+## Co se stane, když někdo požaduje webové stránky ze serveru?
+
+Pokud přijde žádost na webový server, je předána Django frameworku, který se snaží přijít na to, co vlastně uživatel požaduje. Nejprve vezme adresu webové stránky a snaží se přijít na to, co udělat. Tuto část provádí Django **urlresolver** (všimni si, že adresa webové stránky se nazývá URL - Uniform Resource Locator - proto jméno *urlresolver* dává smysl). Tato činnost není složitá - bere si seznam vzorů a v něm se pokouší vyhledat shodu s URL. Django kontroluje seznam vzorů od shora dolů a pokud některý odpovídá, pak Django předá žádost související funkci, která se nazývá *view*.
+
+Představ si pošťáka s dopisem. Kráčí po ulici a kontroluje každé číslo domu, jestli odpovídá adrese na dopisu. Pokud adresa odpovídá, dopis vloží do schránky. Stejným způsobem funguje urlresolver!
+
+Ve funkci *view* se provádí všechny zajímavé věci: můžeme se podívat do databáze a vyhledat nějaké informace. Co když chce uživatel změnit něco v datech? Dopis může říkat "prosím změňte popis mé práce." *View* může zkontrolovat, zda máš povolení tuto změnu provést, pak aktualizuje popis práce a odešle ti zprávu: "Hotovo!". V tuto chvíli *view* vygeneruje odpověď a Django ji může odeslat tvému webovému prohlížeci.
+
+Samozřejmě, že výše uvedený popis je trochu zjednodušený, ale prozatím není nutné znát všechny technické detaily. Pro obecnou představu to postačí.
+
+Takže místo studování přílišných podrobností jednoduše začneme něco vytvářet pomocí Djanga, čímž se naučíme všechny důležité části!
diff --git a/cs/django_admin/README.md b/cs/django_admin/README.md
new file mode 100755
index 00000000000..7ddfc186a3e
--- /dev/null
+++ b/cs/django_admin/README.md
@@ -0,0 +1,49 @@
+# Django admin
+
+Chceš-li přidávat, upravovat a mazat příspěvky, které jsme právě vymodelovaly, použijeme Django admin.
+
+Otevřeme soubor `blog/admin.py` a nahradíme jeho obsah následujícím kódem:
+
+```python
+from django.contrib import admin
+from .models import Post
+
+admin.site.register(Post)
+```
+
+Jak vidíš, importujeme (vkládáme) Post model definovaný v předchozí kapitole. Pro zviditelnění našeho modelu na admin stránce musíme zaregistrovat model pomocí `admin.site.register(Post)`.
+
+OK, je čas se podívat na náš Post model. Nezapomeň spustit `Pythonu manage.py runserver` v konzoli www serveru. Přejdi do prohlížeče a zadej adresu http://127.0.0.1:8000/admin/. Uvidíš přihlašovací stránku jako je tato:
+
+![Login page][1]
+
+ [1]: images/login_page2.png
+
+Chceš-li se přihlásit, musíš vytvořit *superusera* - uživatele, který má kontrolu nad celou webovou stránkou. Vrať se do příkazového řádku, zadej `python manage.py createsuperuser` a stiskni klávesu enter. Po zobrazení výzvy zadej své uživatelské jméno (malá písmena, bez mezer), e-mailovou adresu a heslo. Nedělej si starosti, že nevidíš heslo, které zadáváš - tak to má být. Jen ho napiš a stiskni `enter` pro pokračování. Výstup by měl vypadat takto (kde uživatelské jméno a e-mail by měly být tvé vlastní):
+
+```
+(myvenv) ~/djangogirls$ python manage.py createsuperuser
+Username: admin
+Email address: admin@admin.com
+Password:
+Password (again):
+Superuser created successfully.
+```
+
+Vrať se do svého prohlížeče. Přihlas se pomocí pověření superuživatele, kterého jsi právě vytvořila; měla bys vidět Django admin dashboard/nástěnku.
+
+![Django admin][2]
+
+ [2]: images/django_admin3.png
+
+Klikni na příspěvky/Posts a trochu si s nimi pohraj. Přidej pět nebo šest příspěvků blogu. Nedělej si starosti s obsahem - pro ušetření času můžeš jednoduše kopírovat a vložit nějaký text z tohoto kurzu :).
+
+Ujisti se, že alespoň dva nebo tři příspěvky (ale ne všechny) mají nastavené datum publikování. Později to bude užitečné.
+
+![Django admin][3]
+
+ [3]: images/edit_post3.png
+
+Pokud chceš vědět více o Django admin, koukni se do Django dokumentace: https://docs.djangoproject.com/en/1.8/ref/contrib/admin/
+
+V tuto chvíli je asi dobrý čas dát si pro trochu vzpruhy kávu, čaj nebo něco k jídlu. Vytvořila jsi svůj první model Django - zasloužíš si malý oddech!
diff --git a/cs/django_admin/images/django_admin3.png b/cs/django_admin/images/django_admin3.png
new file mode 100644
index 00000000000..ea01ab951bf
Binary files /dev/null and b/cs/django_admin/images/django_admin3.png differ
diff --git a/cs/django_admin/images/edit_post3.png b/cs/django_admin/images/edit_post3.png
new file mode 100644
index 00000000000..d577b111424
Binary files /dev/null and b/cs/django_admin/images/edit_post3.png differ
diff --git a/cs/django_admin/images/login_page2.png b/cs/django_admin/images/login_page2.png
new file mode 100644
index 00000000000..6ae26e9959a
Binary files /dev/null and b/cs/django_admin/images/login_page2.png differ
diff --git a/cs/django_forms/README.md b/cs/django_forms/README.md
new file mode 100755
index 00000000000..8ea26f584c1
--- /dev/null
+++ b/cs/django_forms/README.md
@@ -0,0 +1,395 @@
+# Django formuláře
+
+Poslední věc, kterou chceme udělat na našich webových stránkách, je vytvořit pohodlný způsob, jak přidávat a upravovat příspěvky na blogu. Django `admin` je super, ale je těžké ho přizpůsobit a upravit do hezčí podoby. S `formuláři` budeme mít absolutní moc nad naším rozhraním - můžeme dělat téměř cokoliv, co si dokážeme představit!
+
+Pěkná věc na Django formulářích je, že je můžeme definovat úplně od počátku nebo vytvořit `ModelForm`, který uloží výsledek z formuláře pomocí modelu.
+
+To je přesně to, co chceme udělat: vytvoříme formulář pro náš model `Post`.
+
+Stejně jako všechny důležité části Djanga mají formuláře své vlastní soubory: `forms.py`.
+
+V našem adresáři potřebujeme vytvořit soubor s názvem `blog`.
+
+```
+blog
+ └── forms.py
+```
+
+OK, otevři ho a zadej následující kód:
+
+```python
+ from django import forms
+
+ from .models import Post
+
+ class PostForm(forms.ModelForm):
+ class Meta:
+ model = Post
+ fields = ('title', 'text',)
+```
+
+Musíme nejdříve importovat Django formuláře (`from django import forms`) a samozřejmě náš `Post` model (`from .models import Post`).
+
+`PostForm`, jak asi předpokládáš, je jméno našeho formuláře. Musíme říct Djangu, že tento formulář je `ModelForm` (tak pro nás bude moci Django udělat něco magického) - zodpovědný za to bude `forms.ModelForm`.
+
+Dále zde máme `třídu Meta`, kde řekneme Djangu, který model by měl být použit k vytvoření tohoto formuláře (`model = Post`).
+
+Nakonec můžeme Djangu říct, co se má stát s jednotlivými poli našeho formuláře. V tomto případě chceme pouze zobrazit pole `nadpis/title` a `text` - `autor` by měl být člověk, který je aktuálně přihlášen (ty!) a `created_date` by mělo být automaticky nastaveno, když vytvoříme příspěvek (tj. v kódu).
+
+A je to! Vše, co teď musíme udělat, je použít formulář ve *view* a zobrazit ho v šabloně.
+
+Takže ještě jednou: budeme vytvářet odkaz na stránky, URL, pohled a šablonu.
+
+## Odkaz na stránku s formulářem
+
+Je tedy čas otevřít soubor `blog/templates/blog/base.html`. Přidáme odkaz do `div` s názvem `page-header`:
+
+```html
+
+```
+
+Všimni si, že chceme zavolat náš nový view `post_new`.
+
+Po přidání řádku by měl tvůj html soubor vypadat takto:
+
+```html
+{% load staticfiles %}
+
+
+ Django Girls blog
+
+
+
+
+
+
+
+
+
+```
+
+Po uložení a obnovení stránky http://127.0.0.1:8000 patrně uvidíš známou `NoReverseMatch` chybu.
+
+## URL
+
+Otevři `blog/urls.py` a přidej řádek:
+
+```python
+url(r'^post/new/$', views.post_new, name='post_new'),
+```
+
+Výsledný kód bude vypadat takto:
+
+```python
+ from django.conf.urls import url
+ from . import views
+
+urlpatterns = [
+ url(r'^$', views.post_list, name='post_list'),
+ url(r'^post/(?P[0-9]+)/$', views.post_detail, name='post_detail'),
+ url(r'^post/new/$', views.post_new, name='post_new'),
+]
+```
+
+Po aktualizaci webu vidíme `AttributeError`, protože nemáme implementovaný `post_new` view. Přidáme ho právě teď.
+
+## post_new view
+
+Musíme otevřít soubor `blog/views.py` a přidat následující řádky:
+
+```python
+from .forms import PostForm
+```
+
+a náš *view*:
+
+```python
+def post_new(request):
+ form = PostForm()
+ return render(request, 'blog/post_edit.html', {'form': form})
+```
+
+Chceš-li vytvořit nový formulář `Post`, musíš zavolat `PostForm()` a předat ho do šablony. Za chvilku se vrátíme k tomuto *view*, ale teď pojďme rychle vytvořit šablonu formuláře.
+
+## Šablona
+
+Musíme vytvořit soubor `post_edit.html` v adresáři `blog/templates/blog`. Pro vytvoření formuláře potřebujeme udělat několik věcí:
+
+* musíme zobrazit formulář. Můžeme to udělat například jednoduchým `{% raw %}{{ form.as_p }}{% endraw %}`.
+* formulář musíme obalit HTML značkou (přidej řádek nad formulář): `< method="POST" >... < / form >`
+* potřebujeme tlačítko `Uložit`. Vytvoříme HTML tlačítko: `< button type="submit"> Uložit < / button>`
+* a nakonec těsně za otevírací značku `< form... >` musíme přidat `{% raw %}{% csrf_token %}{% endraw %}`. Toto je velmi důležité, protože tak vytvoříme bezpečnější formulář! Django si bude stěžovat v okamžiku, kdy se pokusíš uložit formulář, pokud zapomeneš na tuto část:
+
+![CSFR zakázaná stránka][1]
+
+ [1]: images/csrf2.png
+
+Pojďme se nyní podívat, jak by mělo vypadat HTML v `post_edit.html`:
+
+```html
+{% extends 'blog/base.html' %}
+
+{% block content %}
+
New post
+
+{% endblock %}
+```
+
+Čas aktualizovat naší stránku! Hurá! Zobrazil se formulář!
+
+![Nový formulář][2]
+
+ [2]: images/new_form2.png
+
+Ale ještě chvilku počkej! Když něco zadáš do polí `titulek` a `text` a pokusíš se formulář uložit - co se stane?
+
+Nic! Jsme opět na stejné stránce, náš text je pryč... a nepřidal se žádný nový příspěvek. Tak co se stalo?
+
+Odpověď je: nic. Musíme ještě trochu zapracovat na našem *view*.
+
+## Ukládání formuláře
+
+Otevři znovu `blog/views.py`. Vše, co máme aktuálně v `post_new`, je toto:
+
+```python
+def post_new(request):
+ form = PostForm()
+ return render(request, 'blog/post_edit.html', {'form': form})
+```
+
+Když odešleme formulář, vrátíme se zpět na ten samý view, ale tentokrát obdržíme nějaká další data v `request`, přesněji v `request.POST` (pojmenování nemá nic společného s naším "post" v blogu, vychází to z toho, že "zasíláme" data). Pamatuješ si, že v našem HTML souboru ve `