diff --git a/src/account/__init__.py b/src/account/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/account/__pycache__/__init__.cpython-37.pyc b/src/account/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..f0af914 Binary files /dev/null and b/src/account/__pycache__/__init__.cpython-37.pyc differ diff --git a/src/account/__pycache__/admin.cpython-37.pyc b/src/account/__pycache__/admin.cpython-37.pyc new file mode 100644 index 0000000..d353c8d Binary files /dev/null and b/src/account/__pycache__/admin.cpython-37.pyc differ diff --git a/src/account/__pycache__/forms.cpython-37.pyc b/src/account/__pycache__/forms.cpython-37.pyc new file mode 100644 index 0000000..bc08dfd Binary files /dev/null and b/src/account/__pycache__/forms.cpython-37.pyc differ diff --git a/src/account/__pycache__/models.cpython-37.pyc b/src/account/__pycache__/models.cpython-37.pyc new file mode 100644 index 0000000..cf1556b Binary files /dev/null and b/src/account/__pycache__/models.cpython-37.pyc differ diff --git a/src/account/__pycache__/views.cpython-37.pyc b/src/account/__pycache__/views.cpython-37.pyc new file mode 100644 index 0000000..268c047 Binary files /dev/null and b/src/account/__pycache__/views.cpython-37.pyc differ diff --git a/src/account/admin.py b/src/account/admin.py new file mode 100644 index 0000000..ff57595 --- /dev/null +++ b/src/account/admin.py @@ -0,0 +1,19 @@ +from django.contrib import admin +from django.contrib.auth.admin import UserAdmin +from account.models import Account + + +class AccountAdmin(UserAdmin): + list_display = ('email','username','date_joined', 'last_login', 'is_admin','is_staff') + search_fields = ('email','username',) + readonly_fields=('date_joined', 'last_login') + + filter_horizontal = () + list_filter = () + fieldsets = () + + +admin.site.register(Account, AccountAdmin) + + + diff --git a/src/account/apps.py b/src/account/apps.py new file mode 100644 index 0000000..f7b1d19 --- /dev/null +++ b/src/account/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class AccountConfig(AppConfig): + name = 'account' diff --git a/src/account/forms.py b/src/account/forms.py new file mode 100644 index 0000000..8578910 --- /dev/null +++ b/src/account/forms.py @@ -0,0 +1,68 @@ +from django import forms +from django.contrib.auth.forms import UserCreationForm +from django.contrib.auth import authenticate + +from account.models import Account + + +class RegistrationForm(UserCreationForm): + email = forms.EmailField(max_length=254, help_text='Required. Add a valid email address.') + + class Meta: + model = Account + fields = ('email', 'username', 'password1', 'password2', ) + + +class AccountAuthenticationForm(forms.ModelForm): + + password = forms.CharField(label='Password', widget=forms.PasswordInput) + + class Meta: + model = Account + fields = ('email', 'password') + + def clean(self): + if self.is_valid(): + email = self.cleaned_data['email'] + password = self.cleaned_data['password'] + if not authenticate(email=email, password=password): + raise forms.ValidationError("Invalid login") + + +class AccountUpdateForm(forms.ModelForm): + + class Meta: + model = Account + fields = ('email', 'username', ) + + def clean_email(self): + email = self.cleaned_data['email'] + try: + account = Account.objects.exclude(pk=self.instance.pk).get(email=email) + except Account.DoesNotExist: + return email + raise forms.ValidationError('Email "%s" is already in use.' % account) + + def clean_username(self): + username = self.cleaned_data['username'] + try: + account = Account.objects.exclude(pk=self.instance.pk).get(username=username) + except Account.DoesNotExist: + return username + raise forms.ValidationError('Username "%s" is already in use.' % username) + + + + + + + + + + + + + + + + diff --git a/src/account/migrations/0001_initial.py b/src/account/migrations/0001_initial.py new file mode 100644 index 0000000..0ff65e3 --- /dev/null +++ b/src/account/migrations/0001_initial.py @@ -0,0 +1,32 @@ +# Generated by Django 2.2.2 on 2019-06-17 23:44 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Account', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('password', models.CharField(max_length=128, verbose_name='password')), + ('email', models.EmailField(max_length=60, unique=True, verbose_name='email')), + ('username', models.CharField(max_length=30, unique=True)), + ('date_joined', models.DateTimeField(auto_now_add=True, verbose_name='date joined')), + ('last_login', models.DateTimeField(auto_now=True, verbose_name='last login')), + ('is_admin', models.BooleanField(default=False)), + ('is_active', models.BooleanField(default=True)), + ('is_staff', models.BooleanField(default=False)), + ('is_superuser', models.BooleanField(default=False)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/src/account/migrations/__init__.py b/src/account/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/account/migrations/__pycache__/0001_initial.cpython-37.pyc b/src/account/migrations/__pycache__/0001_initial.cpython-37.pyc new file mode 100644 index 0000000..a91f6c9 Binary files /dev/null and b/src/account/migrations/__pycache__/0001_initial.cpython-37.pyc differ diff --git a/src/account/migrations/__pycache__/0002_auto_20190617_1641.cpython-37.pyc b/src/account/migrations/__pycache__/0002_auto_20190617_1641.cpython-37.pyc new file mode 100644 index 0000000..77dac01 Binary files /dev/null and b/src/account/migrations/__pycache__/0002_auto_20190617_1641.cpython-37.pyc differ diff --git a/src/account/migrations/__pycache__/__init__.cpython-37.pyc b/src/account/migrations/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..a94824c Binary files /dev/null and b/src/account/migrations/__pycache__/__init__.cpython-37.pyc differ diff --git a/src/account/models.py b/src/account/models.py new file mode 100644 index 0000000..bd34a7d --- /dev/null +++ b/src/account/models.py @@ -0,0 +1,72 @@ +from django.db import models +from django.contrib.auth.models import AbstractBaseUser, BaseUserManager + + +class MyAccountManager(BaseUserManager): + def create_user(self, email, username, password=None): + if not email: + raise ValueError('Users must have an email address') + if not username: + raise ValueError('Users must have a username') + + user = self.model( + email=self.normalize_email(email), + username=username, + ) + + user.set_password(password) + user.save(using=self._db) + return user + + def create_superuser(self, email, username, password): + user = self.create_user( + email=self.normalize_email(email), + password=password, + username=username, + ) + user.is_admin = True + user.is_staff = True + user.is_superuser = True + user.save(using=self._db) + return user + + +class Account(AbstractBaseUser): + email = models.EmailField(verbose_name="email", max_length=60, unique=True) + username = models.CharField(max_length=30, unique=True) + date_joined = models.DateTimeField(verbose_name='date joined', auto_now_add=True) + last_login = models.DateTimeField(verbose_name='last login', auto_now=True) + is_admin = models.BooleanField(default=False) + is_active = models.BooleanField(default=True) + is_staff = models.BooleanField(default=False) + is_superuser = models.BooleanField(default=False) + + + USERNAME_FIELD = 'email' + REQUIRED_FIELDS = ['username'] + + objects = MyAccountManager() + + def __str__(self): + return self.email + + # For checking permissions. to keep it simple all admin have ALL permissons + def has_perm(self, perm, obj=None): + return self.is_admin + + # Does this user have permission to view this app? (ALWAYS YES FOR SIMPLICITY) + def has_module_perms(self, app_label): + return True + + + + + + + + + + + + + diff --git a/src/account/templates/account/account.html b/src/account/templates/account/account.html new file mode 100644 index 0000000..749eb89 --- /dev/null +++ b/src/account/templates/account/account.html @@ -0,0 +1,74 @@ +{% extends 'base.html' %} + + +{% block content %} + + + + +
+ + +{% endblock content %} + + diff --git a/src/account/templates/account/login.html b/src/account/templates/account/login.html new file mode 100644 index 0000000..20b24b9 --- /dev/null +++ b/src/account/templates/account/login.html @@ -0,0 +1,69 @@ +{% extends 'base.html' %} + + +{% block content %} + + + + + + + +{% endblock content %} + + diff --git a/src/account/templates/account/register.html b/src/account/templates/account/register.html new file mode 100644 index 0000000..344b3d2 --- /dev/null +++ b/src/account/templates/account/register.html @@ -0,0 +1,82 @@ +{% extends 'base.html' %} + + +{% block content %} + + + + + + + + +{% endblock content %} + + + diff --git a/src/account/tests.py b/src/account/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/src/account/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/src/account/views.py b/src/account/views.py new file mode 100644 index 0000000..f53a472 --- /dev/null +++ b/src/account/views.py @@ -0,0 +1,85 @@ +from django.shortcuts import render, redirect +from django.contrib.auth import login, authenticate, logout +from account.forms import RegistrationForm, AccountAuthenticationForm, AccountUpdateForm + + +def registration_view(request): + context = {} + if request.POST: + form = RegistrationForm(request.POST) + if form.is_valid(): + form.save() + email = form.cleaned_data.get('email') + raw_password = form.cleaned_data.get('password1') + account = authenticate(email=email, password=raw_password) + login(request, account) + return redirect('home') + else: + context['registration_form'] = form + + else: + form = RegistrationForm() + context['registration_form'] = form + return render(request, 'account/register.html', context) + + +def logout_view(request): + logout(request) + return redirect('/') + + +def login_view(request): + + context = {} + + user = request.user + if user.is_authenticated: + return redirect("home") + + if request.POST: + form = AccountAuthenticationForm(request.POST) + if form.is_valid(): + email = request.POST['email'] + password = request.POST['password'] + user = authenticate(email=email, password=password) + + if user: + login(request, user) + return redirect("home") + + else: + form = AccountAuthenticationForm() + + context['login_form'] = form + + # print(form) + return render(request, "account/login.html", context) + + +def account_view(request): + + if not request.user.is_authenticated: + return redirect("login") + + context = {} + if request.POST: + form = AccountUpdateForm(request.POST, instance=request.user) + if form.is_valid(): + form.initial = { + "email": request.POST['email'], + "username": request.POST['username'], + } + form.save() + context['success_message'] = "Updated" + else: + form = AccountUpdateForm( + + initial={ + "email": request.user.email, + "username": request.user.username, + } + ) + + context['account_form'] = form + return render(request, "account/account.html", context) + diff --git a/src/db.sqlite3 b/src/db.sqlite3 new file mode 100644 index 0000000..abeaca9 Binary files /dev/null and b/src/db.sqlite3 differ diff --git a/src/manage.py b/src/manage.py new file mode 100644 index 0000000..341863c --- /dev/null +++ b/src/manage.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + 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?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() diff --git a/src/mysite/__init__.py b/src/mysite/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/mysite/__pycache__/__init__.cpython-37.pyc b/src/mysite/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..6fc3503 Binary files /dev/null and b/src/mysite/__pycache__/__init__.cpython-37.pyc differ diff --git a/src/mysite/__pycache__/settings.cpython-37.pyc b/src/mysite/__pycache__/settings.cpython-37.pyc new file mode 100644 index 0000000..4ccf0a0 Binary files /dev/null and b/src/mysite/__pycache__/settings.cpython-37.pyc differ diff --git a/src/mysite/__pycache__/urls.cpython-37.pyc b/src/mysite/__pycache__/urls.cpython-37.pyc new file mode 100644 index 0000000..2eef546 Binary files /dev/null and b/src/mysite/__pycache__/urls.cpython-37.pyc differ diff --git a/src/mysite/__pycache__/wsgi.cpython-37.pyc b/src/mysite/__pycache__/wsgi.cpython-37.pyc new file mode 100644 index 0000000..f3f9c54 Binary files /dev/null and b/src/mysite/__pycache__/wsgi.cpython-37.pyc differ diff --git a/src/mysite/settings.py b/src/mysite/settings.py new file mode 100644 index 0000000..928b963 --- /dev/null +++ b/src/mysite/settings.py @@ -0,0 +1,129 @@ +""" +Django settings for mysite project. + +Generated by 'django-admin startproject' using Django 2.2.2. + +For more information on this file, see +https://docs.djangoproject.com/en/2.2/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/2.2/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/2.2/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = '!p1ai_b373g3bmz-**m@%h9+0_8xm7*41etdbi+t266-mogm08' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + + # My apps + 'personal', + 'account', + + + # django apps + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', +] + +AUTH_USER_MODEL = 'account.Account' + +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 = 'mysite.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [os.path.join(BASE_DIR, 'templates')], + '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 = 'mysite.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/2.2/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/2.2/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/2.2/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/2.2/howto/static-files/ + +STATIC_URL = '/static/' diff --git a/src/mysite/urls.py b/src/mysite/urls.py new file mode 100644 index 0000000..ada2e0e --- /dev/null +++ b/src/mysite/urls.py @@ -0,0 +1,37 @@ +"""mysite URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/2.2/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.contrib import admin +from django.urls import path + +from personal.views import ( + home_screen_view, +) + +from account.views import ( + registration_view, + logout_view, + login_view, + account_view, +) + +urlpatterns = [ + path('admin/', admin.site.urls), + path('', home_screen_view, name="home"), + path('register/', registration_view, name="register"), + path('logout/', logout_view, name="logout"), + path('login/', login_view, name="login"), + path('account/', account_view, name="account"), +] diff --git a/src/mysite/wsgi.py b/src/mysite/wsgi.py new file mode 100644 index 0000000..45e28c9 --- /dev/null +++ b/src/mysite/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for mysite 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/2.2/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings') + +application = get_wsgi_application() diff --git a/src/personal/__init__.py b/src/personal/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/personal/__pycache__/__init__.cpython-37.pyc b/src/personal/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..4d402d0 Binary files /dev/null and b/src/personal/__pycache__/__init__.cpython-37.pyc differ diff --git a/src/personal/__pycache__/admin.cpython-37.pyc b/src/personal/__pycache__/admin.cpython-37.pyc new file mode 100644 index 0000000..6f057f8 Binary files /dev/null and b/src/personal/__pycache__/admin.cpython-37.pyc differ diff --git a/src/personal/__pycache__/models.cpython-37.pyc b/src/personal/__pycache__/models.cpython-37.pyc new file mode 100644 index 0000000..914934c Binary files /dev/null and b/src/personal/__pycache__/models.cpython-37.pyc differ diff --git a/src/personal/__pycache__/views.cpython-37.pyc b/src/personal/__pycache__/views.cpython-37.pyc new file mode 100644 index 0000000..6cf2d91 Binary files /dev/null and b/src/personal/__pycache__/views.cpython-37.pyc differ diff --git a/src/personal/admin.py b/src/personal/admin.py new file mode 100644 index 0000000..c6fe108 --- /dev/null +++ b/src/personal/admin.py @@ -0,0 +1,2 @@ +from django.contrib import admin + diff --git a/src/personal/apps.py b/src/personal/apps.py new file mode 100644 index 0000000..ff995e0 --- /dev/null +++ b/src/personal/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class PersonalConfig(AppConfig): + name = 'personal' diff --git a/src/personal/migrations/0001_initial.py b/src/personal/migrations/0001_initial.py new file mode 100644 index 0000000..c93ce0e --- /dev/null +++ b/src/personal/migrations/0001_initial.py @@ -0,0 +1,27 @@ +# Generated by Django 2.2.2 on 2019-06-19 18:01 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Question', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=60)), + ('question', models.TextField(max_length=400)), + ('priority', models.CharField(choices=[('L', 'Low'), ('M', 'Medium'), ('H', 'High')], max_length=1)), + ], + options={ + 'verbose_name': 'The Question', + 'verbose_name_plural': 'Questions from People', + }, + ), + ] diff --git a/src/personal/migrations/0002_delete_question.py b/src/personal/migrations/0002_delete_question.py new file mode 100644 index 0000000..9c222aa --- /dev/null +++ b/src/personal/migrations/0002_delete_question.py @@ -0,0 +1,16 @@ +# Generated by Django 2.2.2 on 2019-06-19 18:24 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('personal', '0001_initial'), + ] + + operations = [ + migrations.DeleteModel( + name='Question', + ), + ] diff --git a/src/personal/migrations/__init__.py b/src/personal/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/personal/migrations/__pycache__/0001_initial.cpython-37.pyc b/src/personal/migrations/__pycache__/0001_initial.cpython-37.pyc new file mode 100644 index 0000000..2f5ca7b Binary files /dev/null and b/src/personal/migrations/__pycache__/0001_initial.cpython-37.pyc differ diff --git a/src/personal/migrations/__pycache__/0002_auto_20190617_0949.cpython-37.pyc b/src/personal/migrations/__pycache__/0002_auto_20190617_0949.cpython-37.pyc new file mode 100644 index 0000000..6fb0d68 Binary files /dev/null and b/src/personal/migrations/__pycache__/0002_auto_20190617_0949.cpython-37.pyc differ diff --git a/src/personal/migrations/__pycache__/0002_delete_question.cpython-37.pyc b/src/personal/migrations/__pycache__/0002_delete_question.cpython-37.pyc new file mode 100644 index 0000000..5243498 Binary files /dev/null and b/src/personal/migrations/__pycache__/0002_delete_question.cpython-37.pyc differ diff --git a/src/personal/migrations/__pycache__/0003_auto_20190617_0950.cpython-37.pyc b/src/personal/migrations/__pycache__/0003_auto_20190617_0950.cpython-37.pyc new file mode 100644 index 0000000..2838320 Binary files /dev/null and b/src/personal/migrations/__pycache__/0003_auto_20190617_0950.cpython-37.pyc differ diff --git a/src/personal/migrations/__pycache__/0004_auto_20190617_0952.cpython-37.pyc b/src/personal/migrations/__pycache__/0004_auto_20190617_0952.cpython-37.pyc new file mode 100644 index 0000000..b026e33 Binary files /dev/null and b/src/personal/migrations/__pycache__/0004_auto_20190617_0952.cpython-37.pyc differ diff --git a/src/personal/migrations/__pycache__/__init__.cpython-37.pyc b/src/personal/migrations/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..5be3e6c Binary files /dev/null and b/src/personal/migrations/__pycache__/__init__.cpython-37.pyc differ diff --git a/src/personal/models.py b/src/personal/models.py new file mode 100644 index 0000000..d25c95b --- /dev/null +++ b/src/personal/models.py @@ -0,0 +1,23 @@ +from django.db import models + +# #Two tuple structure +# #The first element in each tuple is the value that will be stored in the database. The second element is displayed by the field’s form widget. +# #Tuple +# PRIORITY = [ +# ('L', 'Low'), #Tuple1 +# ('M', 'Medium'), #Tuple2 +# ('H', 'High'), #Tuple3 +# ] + +# class Question(models.Model): +# title = models.CharField(max_length=60) +# question = models.TextField(max_length=400) +# priority = models.CharField(max_length=1, choices=PRIORITY) + +# def __str__(self): +# return self.title + + +# class Meta: +# verbose_name = 'The Question' +# verbose_name_plural = 'Questions from People' \ No newline at end of file diff --git a/src/personal/templates/personal/home.html b/src/personal/templates/personal/home.html new file mode 100644 index 0000000..bd28293 --- /dev/null +++ b/src/personal/templates/personal/home.html @@ -0,0 +1,25 @@ +{% extends 'base.html' %} + + +{% block content %} + +In this course you'll learn how to build a simple blog with user registration and blog CRUD functionality. Django is a powerful + framework and you'll see why in this course.
+{{user}}
+ {% endfor %} +Hello, {{request.user.username}}
+ {% endif %} + + +