From cd9f82cb61b90abc91506647dc20f661c01b8df0 Mon Sep 17 00:00:00 2001 From: shaunoftheshed pelling Date: Mon, 30 Oct 2017 17:11:42 +0000 Subject: [PATCH 1/6] lesson 2 code --- djangonautic/djangonautic/__init__.py | 0 djangonautic/djangonautic/settings.py | 120 ++++++++++++++++++++++++++ djangonautic/djangonautic/urls.py | 21 +++++ djangonautic/djangonautic/wsgi.py | 16 ++++ djangonautic/manage.py | 22 +++++ 5 files changed, 179 insertions(+) create mode 100644 djangonautic/djangonautic/__init__.py create mode 100644 djangonautic/djangonautic/settings.py create mode 100644 djangonautic/djangonautic/urls.py create mode 100644 djangonautic/djangonautic/wsgi.py create mode 100644 djangonautic/manage.py diff --git a/djangonautic/djangonautic/__init__.py b/djangonautic/djangonautic/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/djangonautic/djangonautic/settings.py b/djangonautic/djangonautic/settings.py new file mode 100644 index 0000000..29b9c4c --- /dev/null +++ b/djangonautic/djangonautic/settings.py @@ -0,0 +1,120 @@ +""" +Django settings for djangonautic project. + +Generated by 'django-admin startproject' using Django 1.11.6. + +For more information on this file, see +https://docs.djangoproject.com/en/1.11/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/1.11/ref/settings/ +""" + +import os + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'v=q4mi9r6zuq8fg3ej-nrt)pt6h$jm^y)$wo))+d^&c&f2i#&n' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'djangonautic.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'djangonautic.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/1.11/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + } +} + + +# Password validation +# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/1.11/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/1.11/howto/static-files/ + +STATIC_URL = '/static/' diff --git a/djangonautic/djangonautic/urls.py b/djangonautic/djangonautic/urls.py new file mode 100644 index 0000000..d9f8b94 --- /dev/null +++ b/djangonautic/djangonautic/urls.py @@ -0,0 +1,21 @@ +"""djangonautic URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/1.11/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.conf.urls import url, include + 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) +""" +from django.conf.urls import url +from django.contrib import admin + +urlpatterns = [ + url(r'^admin/', admin.site.urls), +] diff --git a/djangonautic/djangonautic/wsgi.py b/djangonautic/djangonautic/wsgi.py new file mode 100644 index 0000000..d5c2d78 --- /dev/null +++ b/djangonautic/djangonautic/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for djangonautic project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/1.11/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djangonautic.settings") + +application = get_wsgi_application() diff --git a/djangonautic/manage.py b/djangonautic/manage.py new file mode 100644 index 0000000..46ad651 --- /dev/null +++ b/djangonautic/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +import os +import sys + +if __name__ == "__main__": + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djangonautic.settings") + try: + from django.core.management import execute_from_command_line + except ImportError: + # The above import may fail for some other reason. Ensure that the + # issue is really that Django is missing to avoid masking other + # exceptions on Python 2. + try: + import django + except ImportError: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) + raise + execute_from_command_line(sys.argv) From b14e2e103e13e6e2cf1eca9d5c70102fffaaf24a Mon Sep 17 00:00:00 2001 From: shaunoftheshed pelling Date: Thu, 2 Nov 2017 18:11:55 +0000 Subject: [PATCH 2/6] lesson 3 code --- djangonautic/db.sqlite3 | Bin 0 -> 12288 bytes djangonautic/djangonautic/urls.py | 18 +++--------------- djangonautic/djangonautic/views.py | 7 +++++++ 3 files changed, 10 insertions(+), 15 deletions(-) create mode 100644 djangonautic/db.sqlite3 create mode 100644 djangonautic/djangonautic/views.py diff --git a/djangonautic/db.sqlite3 b/djangonautic/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..0db2f7b40fabaa1b4f6d451d0088fb4056845788 GIT binary patch literal 12288 zcmeI#Jx{|h5C&koMKJNPbv;E4iCR<%)SZAbRHSJM>5!>1jR{8iXcNN@Kau}~go9`$ zS|Jvu>OIM^F7`Relj-hmeWfKmlvOS?U9c0zIlClcjBzvCW~`#g_g0CSoBXff?ChgD zG`m_y@9g;0To4d|00bZa0SG_<0uX=z1Rwx`e-W6p_B-7!kF~hZWWCHxdpoP;@>v%1 z&9r?TdT!)VCyl%y>X9WD3yWSvHGdS9eLfgC z>oT+0yzB3)rZiL1JTMVjYL&}%snhi4rs+pO00Izz00bZa0SG_<0uX=z1R$`(0_gvD c_~+u&AOHafKmY;|fB*y_009U<00Q3vpP(*l(f|Me literal 0 HcmV?d00001 diff --git a/djangonautic/djangonautic/urls.py b/djangonautic/djangonautic/urls.py index d9f8b94..303d103 100644 --- a/djangonautic/djangonautic/urls.py +++ b/djangonautic/djangonautic/urls.py @@ -1,21 +1,9 @@ -"""djangonautic URL Configuration - -The `urlpatterns` list routes URLs to views. For more information please see: - https://docs.djangoproject.com/en/1.11/topics/http/urls/ -Examples: -Function views - 1. Add an import: from my_app import views - 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') -Class-based views - 1. Add an import: from other_app.views import Home - 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') -Including another URLconf - 1. Import the include() function: from django.conf.urls import url, include - 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) -""" from django.conf.urls import url from django.contrib import admin +from . import views urlpatterns = [ url(r'^admin/', admin.site.urls), + url(r'^about/$', views.about), + url(r'^$', views.homepage), ] diff --git a/djangonautic/djangonautic/views.py b/djangonautic/djangonautic/views.py new file mode 100644 index 0000000..d39706c --- /dev/null +++ b/djangonautic/djangonautic/views.py @@ -0,0 +1,7 @@ +from django.http import HttpResponse + +def homepage(request): + return HttpResponse('homepage') + +def about(request): + return HttpResponse('about') From 19be0c4d730dde180381a8b0b40354da4de39ffd Mon Sep 17 00:00:00 2001 From: shaunoftheshed pelling Date: Fri, 3 Nov 2017 11:17:53 +0000 Subject: [PATCH 3/6] lesson 4 code --- djangonautic/djangonautic/settings.py | 2 +- djangonautic/djangonautic/views.py | 7 +++++-- djangonautic/templates/about.html | 11 +++++++++++ djangonautic/templates/homepage.html | 11 +++++++++++ 4 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 djangonautic/templates/about.html create mode 100644 djangonautic/templates/homepage.html diff --git a/djangonautic/djangonautic/settings.py b/djangonautic/djangonautic/settings.py index 29b9c4c..2149e89 100644 --- a/djangonautic/djangonautic/settings.py +++ b/djangonautic/djangonautic/settings.py @@ -54,7 +54,7 @@ TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], + 'DIRS': ['templates'], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ diff --git a/djangonautic/djangonautic/views.py b/djangonautic/djangonautic/views.py index d39706c..6021147 100644 --- a/djangonautic/djangonautic/views.py +++ b/djangonautic/djangonautic/views.py @@ -1,7 +1,10 @@ from django.http import HttpResponse +from django.shortcuts import render def homepage(request): - return HttpResponse('homepage') + # return HttpResponse('homepage') + return render(request, 'homepage.html') def about(request): - return HttpResponse('about') + # return HttpResponse('about') + return render(request, 'about.html') diff --git a/djangonautic/templates/about.html b/djangonautic/templates/about.html new file mode 100644 index 0000000..c75ced9 --- /dev/null +++ b/djangonautic/templates/about.html @@ -0,0 +1,11 @@ + + + + + About + + +

About Us

+

We like django.

+ + diff --git a/djangonautic/templates/homepage.html b/djangonautic/templates/homepage.html new file mode 100644 index 0000000..7aecf49 --- /dev/null +++ b/djangonautic/templates/homepage.html @@ -0,0 +1,11 @@ + + + + + Homepage + + +

This is the homepage

+

Welcome to Djangonauts

+ + From 941090ebb330d622d69fc34be898e753b746b461 Mon Sep 17 00:00:00 2001 From: shaunoftheshed pelling Date: Fri, 10 Nov 2017 10:05:29 +0000 Subject: [PATCH 4/6] lesson 5 code --- djangonautic/articles/__init__.py | 0 djangonautic/articles/admin.py | 3 +++ djangonautic/articles/apps.py | 5 +++++ djangonautic/articles/migrations/__init__.py | 0 djangonautic/articles/models.py | 3 +++ .../articles/templates/articles/article_list.html | 10 ++++++++++ djangonautic/articles/tests.py | 3 +++ djangonautic/articles/urls.py | 6 ++++++ djangonautic/articles/views.py | 4 ++++ djangonautic/djangonautic/settings.py | 1 + djangonautic/djangonautic/urls.py | 3 ++- 11 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 djangonautic/articles/__init__.py create mode 100644 djangonautic/articles/admin.py create mode 100644 djangonautic/articles/apps.py create mode 100644 djangonautic/articles/migrations/__init__.py create mode 100644 djangonautic/articles/models.py create mode 100644 djangonautic/articles/templates/articles/article_list.html create mode 100644 djangonautic/articles/tests.py create mode 100644 djangonautic/articles/urls.py create mode 100644 djangonautic/articles/views.py diff --git a/djangonautic/articles/__init__.py b/djangonautic/articles/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/djangonautic/articles/admin.py b/djangonautic/articles/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/djangonautic/articles/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/djangonautic/articles/apps.py b/djangonautic/articles/apps.py new file mode 100644 index 0000000..bc12dfb --- /dev/null +++ b/djangonautic/articles/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class ArticlesConfig(AppConfig): + name = 'articles' diff --git a/djangonautic/articles/migrations/__init__.py b/djangonautic/articles/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/djangonautic/articles/models.py b/djangonautic/articles/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/djangonautic/articles/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/djangonautic/articles/templates/articles/article_list.html b/djangonautic/articles/templates/articles/article_list.html new file mode 100644 index 0000000..9acfec2 --- /dev/null +++ b/djangonautic/articles/templates/articles/article_list.html @@ -0,0 +1,10 @@ + + + + + + + +

Articles List

+ + diff --git a/djangonautic/articles/tests.py b/djangonautic/articles/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/djangonautic/articles/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/djangonautic/articles/urls.py b/djangonautic/articles/urls.py new file mode 100644 index 0000000..9183685 --- /dev/null +++ b/djangonautic/articles/urls.py @@ -0,0 +1,6 @@ +from django.conf.urls import url +from . import views + +urlpatterns = [ + url(r'^$', views.article_list), +] diff --git a/djangonautic/articles/views.py b/djangonautic/articles/views.py new file mode 100644 index 0000000..8e37c76 --- /dev/null +++ b/djangonautic/articles/views.py @@ -0,0 +1,4 @@ +from django.shortcuts import render + +def article_list(request): + return render(request, 'articles/article_list.html') diff --git a/djangonautic/djangonautic/settings.py b/djangonautic/djangonautic/settings.py index 2149e89..f60e17b 100644 --- a/djangonautic/djangonautic/settings.py +++ b/djangonautic/djangonautic/settings.py @@ -37,6 +37,7 @@ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'articles', ] MIDDLEWARE = [ diff --git a/djangonautic/djangonautic/urls.py b/djangonautic/djangonautic/urls.py index 303d103..426082f 100644 --- a/djangonautic/djangonautic/urls.py +++ b/djangonautic/djangonautic/urls.py @@ -1,9 +1,10 @@ -from django.conf.urls import url +from django.conf.urls import url, include from django.contrib import admin from . import views urlpatterns = [ url(r'^admin/', admin.site.urls), + url(r'^articles/', include('articles.urls')), url(r'^about/$', views.about), url(r'^$', views.homepage), ] From 5f1008b91759638955570425022979ed0d34be5d Mon Sep 17 00:00:00 2001 From: shaunoftheshed pelling Date: Fri, 10 Nov 2017 10:20:39 +0000 Subject: [PATCH 5/6] lesson 6 code --- djangonautic/articles/models.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/djangonautic/articles/models.py b/djangonautic/articles/models.py index 71a8362..e735ab7 100644 --- a/djangonautic/articles/models.py +++ b/djangonautic/articles/models.py @@ -1,3 +1,10 @@ from django.db import models # Create your models here. +class Article(models.Model): + title = models.CharField(max_length=100) + slug = models.SlugField() + body = models.TextField() + date = models.DateTimeField(auto_now_add=True) + # add in thumbnail later + # add in author later From f6f75d35ee1ccca695977f11f80c650e1624cc88 Mon Sep 17 00:00:00 2001 From: shaunoftheshed pelling Date: Fri, 10 Nov 2017 10:24:53 +0000 Subject: [PATCH 6/6] lesson 7 code --- .../articles/migrations/0001_initial.py | 26 ++++++++++++++++++ djangonautic/db.sqlite3 | Bin 12288 -> 139264 bytes 2 files changed, 26 insertions(+) create mode 100644 djangonautic/articles/migrations/0001_initial.py diff --git a/djangonautic/articles/migrations/0001_initial.py b/djangonautic/articles/migrations/0001_initial.py new file mode 100644 index 0000000..47c4018 --- /dev/null +++ b/djangonautic/articles/migrations/0001_initial.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.6 on 2017-11-10 10:23 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Article', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=100)), + ('slug', models.SlugField()), + ('body', models.TextField()), + ('date', models.DateTimeField(auto_now_add=True)), + ], + ), + ] diff --git a/djangonautic/db.sqlite3 b/djangonautic/db.sqlite3 index 0db2f7b40fabaa1b4f6d451d0088fb4056845788..ef18973fdf16577099c6c1d68087b922883be58d 100644 GIT binary patch literal 139264 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 KZe}d_FAo53aSc@f