A cheat-sheet for creating web apps with the Django framework using the Python language. Most of the summaries and examples are based on the official documentation for Django v2.0.
$ mkdir <folder>
and navigate to it with $ cd <folder>
$ pipenv install
$ pipenv shell
$ pipenv install django
$ pipenv install <package_name>
$ cd <folder>
$ django-admin startproject <project_name>
The project directory should look like this:
project/
manage.py
project/
__init__.py
settings.py
urls.py
wsgi.py
$ python manage.py runserver
within the project directorySECRET_KEY
to be more secure, you can set it to reference an environment variablesettings.py
file within the project directory change the SECRET_KEY
line to the following:
SECRET_KEY = os.environ.get('SECRET_KEY')
>>> import secrets
>>> secrets.token_hex()
export SECRET_KEY=<secret_key>
$ cd <outer_project_folder>
$ python manage.py startapp <app_name>
app
folder, create a file called urls.py
The project directory should now look like this:
project/
manage.py
db.sqlite3
project/
__init__.py
settings.py
urls.py
wsgi.py
app/
migrations/
__init__.py
__init__.py
admin.py
apps.py
models.py
tests.py
urls.py
views.py
settings.py
file by adding its name to the INSTALLED_APPS
list:
INSTALLED_APPS = [
'app',
# ...
]
$ python manage.py migrate
views.py
and add the following:def index(request):
return HttpResponse(“Hello, World!”)
- Still within the app directory, open (or create) `urls.py`
```python
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
urls.py
to include the followingurlpatterns = [
path(‘app/’, include(‘app.urls’)),
path(‘admin/’, admin.site.urls),
]
- To create a url pattern to the index of the site, use the following urlpattern:
```python
urlpatterns = [
path("", include('app.urls')),
]
urls.py
urls.py
file within app directories are organized by the urls.py
found in the project folder.app/
templates/
index.html
static/
style.css
script.js
views.py
within the app directory and include the following:def index(request):
return render(request,’index.html’)
- To include context to the template:
```python
def index(request):
context = {"context_variable": context_variable}
return render(request,'index.html', context)
<!DOCTYPE html>
- To make sure to include the following in your `settings,py`:
```python
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static")
]
extends
:{% block content %}
Hello, World!
{% endblock %}
- And then in `base.html` add:
```html
<body>
{% block content %}{% endblock %}
</body>
models.py
file, an example of a simple model can be added with the following:class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
*Note that you don't need to create a primary key, Django automatically adds an IntegerField.*
- To perform changes in your models, use the following commands in your shell:
$ python manage.py makemigrations
*Note: including <app_name> is optional.*
- A one-to-many relationship can be made with a `ForeignKey`:
```python
class Musician(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
instrument = models.CharField(max_length=100)
class Album(models.Model):
artist = models.ForeignKey(Musician, on_delete=models.CASCADE)
name = models.CharField(max_length=100)
release_date = models.DateField()
num_stars = models.IntegerField()
>>> m = Musician.objects.get(pk=1)
>>> a = m.album_set.get()
ManyToManyField
:class Pizza(models.Model):
# …
toppings = models.ManyToManyField(Topping)
*Note that the `ManyToManyField` is **only defined in one model**. It doesn't matter which model has the field, but if in doubt, it should be in the model that will be interacted with in a form.*
- Although Django provides a `OneToOneField` relation, a one-to-one relationship can also be defined by adding the kwarg of `unique = True` to a model's `ForeignKey`:
```python
ForeignKey(SomeModel, unique=True)
models.py
file:class Blog(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField()
def __str__(self):
return self.name
class Author(models.Model):
name = models.CharField(max_length=200)
email = models.EmailField()
def __str__(self):
return self.name
class Entry(models.Model):
blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
headline = models.CharField(max_length=255)
body_text = models.TextField()
pub_date = models.DateField()
mod_date = models.DateField()
authors = models.ManyToManyField(Author)
n_comments = models.IntegerField()
n_pingbacks = models.IntegerField()
rating = models.IntegerField()
def __str__(self):
return self.headline ``` - To create an object within the shell: ``` $ python manage.py shell ``` ```python >>> from blog.models import Blog >>> b = Blog(name='Beatles Blog', tagline='All the latest Beatles news.') >>> b.save() ``` - To save a change in an object: ```python >>> b.name = 'The Best Beatles Blog' >>> b.save() ``` - To retrieve objects: ```python >>> all_entries = Entry.objects.all() >>> indexed_entry = Entry.objects.get(pk=1) >>> find_entry = Entry.objects.filter(name='Beatles Blog') ```
superuser
:
$ python manage.py createsuperuser
admin.py
:admin.site.register(Author)
admin.site.register(Book)
```