+
+ {% endfor %}
+ {% if is_paginated %}
+
+ {% if page_obj.has_previous %}
+ First
+ Previous
+ {% endif %}
+
+ {% for num in page_obj.paginator.page_range %}
+ {% if page_obj.number == num %}
+ {{ num }}
+ {% elif num > page_obj.number|add:'-3' and num < page_obj.number|add:'3' %}
+ {{ num }}
+ {% endif %}
+ {% endfor %}
+
+ {% if page_obj.has_next %}
+ Next
+ Last
+ {% endif %}
+
+ {% endif %}
+{% endblock content %}
diff --git a/django_project/blog/tests.py b/django_project/blog/tests.py
new file mode 100644
index 0000000..7ce503c
--- /dev/null
+++ b/django_project/blog/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/django_project/blog/urls.py b/django_project/blog/urls.py
new file mode 100644
index 0000000..5db7bfb
--- /dev/null
+++ b/django_project/blog/urls.py
@@ -0,0 +1,21 @@
+from django.urls import path
+from .views import (
+ PostListView,
+ PostDetailView,
+ PostCreateView,
+ PostUpdateView,
+ PostDeleteView,
+ UserPostListView
+)
+from . import views
+
+urlpatterns = [
+ path('', PostListView.as_view(), name='blog-home'),
+ path('user/', UserPostListView.as_view(), name='user-posts'),
+ path('post//', PostDetailView.as_view(), name='post-detail'),
+ path('post/new/', PostCreateView.as_view(), name='post-create'),
+ path('post//update/', PostUpdateView.as_view(), name='post-update'),
+ path('post//delete/', PostDeleteView.as_view(), name='post-delete'),
+ path('about/', views.about, name='blog-about'),
+ path('jobs/', views.job, name='job'),
+]
diff --git a/django_project/blog/views.py b/django_project/blog/views.py
new file mode 100644
index 0000000..9d92f37
--- /dev/null
+++ b/django_project/blog/views.py
@@ -0,0 +1,85 @@
+from django.shortcuts import render, get_object_or_404
+from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
+from django.contrib.auth.models import User
+from django.views.generic import (
+ ListView,
+ DetailView,
+ CreateView,
+ UpdateView,
+ DeleteView
+)
+from .models import Post
+
+
+def home(request):
+ context = {
+ 'posts': Post.objects.all()
+ }
+ return render(request, 'blog/home.html', context)
+
+
+class PostListView(ListView):
+ model = Post
+ template_name = 'blog/home.html' # /_.html
+ context_object_name = 'posts'
+ ordering = ['-date_posted']
+ paginate_by = 5
+
+
+class UserPostListView(ListView):
+ model = Post
+ template_name = 'blog/user_posts.html' # /_.html
+ context_object_name = 'posts'
+ paginate_by = 5
+
+ def get_queryset(self):
+ user = get_object_or_404(User, username=self.kwargs.get('username'))
+ return Post.objects.filter(author=user).order_by('-date_posted')
+
+
+class PostDetailView(DetailView):
+ model = Post
+
+
+class PostCreateView(LoginRequiredMixin, CreateView):
+ model = Post
+ fields = ['title', 'content']
+
+ def form_valid(self, form):
+ form.instance.author = self.request.user
+ return super().form_valid(form)
+
+
+class PostUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
+ model = Post
+ fields = ['title', 'content']
+
+ def form_valid(self, form):
+ form.instance.author = self.request.user
+ return super().form_valid(form)
+
+ def test_func(self):
+ post = self.get_object()
+ if self.request.user == post.author:
+ return True
+ return False
+
+
+class PostDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
+ model = Post
+ success_url = '/'
+
+ def test_func(self):
+ post = self.get_object()
+ if self.request.user == post.author:
+ return True
+ return False
+
+
+def about(request):
+ return render(request, 'blog/about.html', {'title': 'About'})
+
+
+
+def job(request):
+ return render(request, 'blog/job.html', {'title': 'Jobs'})
diff --git a/django_project/db.sqlite3 b/django_project/db.sqlite3
new file mode 100644
index 0000000..1f9d34e
Binary files /dev/null and b/django_project/db.sqlite3 differ
diff --git a/django_project/desktop.ini b/django_project/desktop.ini
new file mode 100644
index 0000000..a7cc8d5
Binary files /dev/null and b/django_project/desktop.ini differ
diff --git a/django_project/django_project/__init__.py b/django_project/django_project/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/django_project/django_project/__pycache__/__init__.cpython-38.pyc b/django_project/django_project/__pycache__/__init__.cpython-38.pyc
new file mode 100644
index 0000000..9c892a2
Binary files /dev/null and b/django_project/django_project/__pycache__/__init__.cpython-38.pyc differ
diff --git a/django_project/django_project/__pycache__/settings.cpython-38.pyc b/django_project/django_project/__pycache__/settings.cpython-38.pyc
new file mode 100644
index 0000000..e202139
Binary files /dev/null and b/django_project/django_project/__pycache__/settings.cpython-38.pyc differ
diff --git a/django_project/django_project/__pycache__/urls.cpython-38.pyc b/django_project/django_project/__pycache__/urls.cpython-38.pyc
new file mode 100644
index 0000000..7da50bb
Binary files /dev/null and b/django_project/django_project/__pycache__/urls.cpython-38.pyc differ
diff --git a/django_project/django_project/__pycache__/wsgi.cpython-38.pyc b/django_project/django_project/__pycache__/wsgi.cpython-38.pyc
new file mode 100644
index 0000000..b1f3340
Binary files /dev/null and b/django_project/django_project/__pycache__/wsgi.cpython-38.pyc differ
diff --git a/django_project/django_project/settings.py b/django_project/django_project/settings.py
new file mode 100644
index 0000000..f18cc75
--- /dev/null
+++ b/django_project/django_project/settings.py
@@ -0,0 +1,138 @@
+"""
+Django settings for django_project project.
+
+Generated by 'django-admin startproject' using Django 2.1.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/2.1/topics/settings/
+
+For the full list of settings and their values, see
+https://docs.djangoproject.com/en/2.1/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.1/howto/deployment/checklist/
+
+# SECURITY WARNING: keep the secret key used in production secret!
+SECRET_KEY = 'exhlfdat&vfum(-34*c2uroi(($ww(yo$9pv98=e6p^gl(-eoj'
+
+# SECURITY WARNING: don't run with debug turned on in production!
+DEBUG = True
+
+ALLOWED_HOSTS = []
+
+
+# Application definition
+
+INSTALLED_APPS = [
+ 'blog.apps.BlogConfig',
+ 'users.apps.UsersConfig',
+ 'crispy_forms',
+ '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 = 'django_project.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 = 'django_project.wsgi.application'
+
+
+# Database
+# https://docs.djangoproject.com/en/2.1/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.1/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.1/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.1/howto/static-files/
+
+STATIC_URL = '/static/'
+
+MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
+MEDIA_URL = '/media/'
+
+CRISPY_TEMPLATE_PACK = 'bootstrap4'
+
+LOGIN_REDIRECT_URL = 'blog-home'
+LOGIN_URL = 'login'
+
+EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
+EMAIL_HOST = 'smtp.gmail.com'
+EMAIL_PORT = 587
+EMAIL_USE_TLS = True
+EMAIL_HOST_USER = os.environ.get('EMAIL_USER')
+EMAIL_HOST_PASSWORD = os.environ.get('EMAIL_PASS')
diff --git a/django_project/django_project/urls.py b/django_project/django_project/urls.py
new file mode 100644
index 0000000..51dbb4b
--- /dev/null
+++ b/django_project/django_project/urls.py
@@ -0,0 +1,54 @@
+"""django_project URL Configuration
+
+The `urlpatterns` list routes URLs to views. For more information please see:
+ https://docs.djangoproject.com/en/2.1/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.contrib.auth import views as auth_views
+from django.urls import path, include
+from django.conf import settings
+from django.conf.urls.static import static
+from users import views as user_views
+
+urlpatterns = [
+ path('admin/', admin.site.urls),
+ path('register/', user_views.register, name='register'),
+ path('profile/', user_views.profile, name='profile'),
+ path('login/', auth_views.LoginView.as_view(template_name='users/login.html'), name='login'),
+ path('logout/', auth_views.LogoutView.as_view(template_name='users/logout.html'), name='logout'),
+ path('password-reset/',
+ auth_views.PasswordResetView.as_view(
+ template_name='users/password_reset.html'
+ ),
+ name='password_reset'),
+ path('password-reset/done/',
+ auth_views.PasswordResetDoneView.as_view(
+ template_name='users/password_reset_done.html'
+ ),
+ name='password_reset_done'),
+ path('password-reset-confirm///',
+ auth_views.PasswordResetConfirmView.as_view(
+ template_name='users/password_reset_confirm.html'
+ ),
+ name='password_reset_confirm'),
+ path('password-reset-complete/',
+ auth_views.PasswordResetCompleteView.as_view(
+ template_name='users/password_reset_complete.html'
+ ),
+ name='password_reset_complete'),
+ path('', include('blog.urls')),
+]
+
+
+if settings.DEBUG:
+ urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
diff --git a/django_project/django_project/wsgi.py b/django_project/django_project/wsgi.py
new file mode 100644
index 0000000..14bd24e
--- /dev/null
+++ b/django_project/django_project/wsgi.py
@@ -0,0 +1,16 @@
+"""
+WSGI config for django_project 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.1/howto/deployment/wsgi/
+"""
+
+import os
+
+from django.core.wsgi import get_wsgi_application
+
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_project.settings')
+
+application = get_wsgi_application()
diff --git a/django_project/manage.py b/django_project/manage.py
new file mode 100644
index 0000000..6b39db5
--- /dev/null
+++ b/django_project/manage.py
@@ -0,0 +1,15 @@
+#!/usr/bin/env python
+import os
+import sys
+
+if __name__ == '__main__':
+ os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_project.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)
diff --git a/django_project/media/default.jpg b/django_project/media/default.jpg
new file mode 100644
index 0000000..38f286f
Binary files /dev/null and b/django_project/media/default.jpg differ
diff --git a/django_project/media/profile_pics/large.jpg b/django_project/media/profile_pics/large.jpg
new file mode 100644
index 0000000..e6104e4
Binary files /dev/null and b/django_project/media/profile_pics/large.jpg differ
diff --git a/django_project/media/profile_pics/large_rbSbk8j.jpg b/django_project/media/profile_pics/large_rbSbk8j.jpg
new file mode 100644
index 0000000..7c310fc
Binary files /dev/null and b/django_project/media/profile_pics/large_rbSbk8j.jpg differ
diff --git a/django_project/media/profile_pics/large_rbSbk8j_LMjfNPX.jpg b/django_project/media/profile_pics/large_rbSbk8j_LMjfNPX.jpg
new file mode 100644
index 0000000..7c310fc
Binary files /dev/null and b/django_project/media/profile_pics/large_rbSbk8j_LMjfNPX.jpg differ
diff --git a/django_project/media/profile_pics/pic.jpg b/django_project/media/profile_pics/pic.jpg
new file mode 100644
index 0000000..24d2c5e
Binary files /dev/null and b/django_project/media/profile_pics/pic.jpg differ
diff --git a/django_project/posts.json b/django_project/posts.json
new file mode 100644
index 0000000..6eb7d77
--- /dev/null
+++ b/django_project/posts.json
@@ -0,0 +1,122 @@
+[
+ {
+ "title": "My Updated Post",
+ "content": "My first updated post!\r\n\r\nThis is exciting!",
+ "user_id": 1
+ },
+ {
+ "title": "A Second Post",
+ "content": "This is a post from a different user...",
+ "user_id": 2
+ },
+ {
+ "title": "Top 5 Programming Lanaguages",
+ "content": "Te melius apeirian postulant cum, labitur admodum cu eos! Tollit equidem constituto ut has. Et per ponderum sadipscing, eu vero dolores recusabo nec! Eum quas epicuri at, eam albucius phaedrum ad, no eum probo fierent singulis. Dicat corrumpit definiebas id usu, in facete scripserit eam.\r\n\r\nVim ei exerci nusquam. Agam detraxit an quo? Quo et partem bonorum sensibus, mutat minimum est ad. In paulo essent signiferumque his, quaestio sadipscing theophrastus ad has. Ancillae appareat qualisque ei has, usu ne assum zril disputationi, sed at gloriatur persequeris.",
+ "user_id": 1
+ },
+ {
+ "title": "Sublime Text Tips and Tricks",
+ "content": "Ea vix dico modus voluptatibus, mel iudico suavitate iracundia eu. Tincidunt voluptatibus pro eu? Nulla omittam eligendi his ne, suas putant ut pri. Ullum repudiare at duo, ut cum habeo minim laudem, dicit libris antiopam has ut! Ex movet feugait mea, eu vim impetus nostrud cotidieque.\r\n\r\nEi suas similique quo, his simul viris congue ex? Graeci possit in est, ne qui minim delectus invenire. Mei ad error homero maluisset, tacimates assentior per in, vix ut vocent accusata! Mei eu inermis pericula patrioque? Debet denique sea at, ad cibo reformidans theophrastus per, cu inermis maiestatis vim!\r\n\r\nUt odio feugiat voluptua est, euismod volutpat qualisque at sit, has ex dicit ornatus inimicus! Eu ferri laoreet vel, dicat corrumpit dissentias nec in. Illum dissentiunt eam ei, praesent voluptatum pri in? Ius in inani petentium, hinc elitr vivendum an vis, in vero dolores electram ius?",
+ "user_id": 1
+ },
+ {
+ "title": "Best Python IDEs",
+ "content": "Elit contentiones nam no, sea ut consul adipiscing. Etiam velit ei usu, sonet clita nonumy eu eum. Usu ea utroque facilisi, cu mel fugit tantas legimus, te vix quem nominavi. Prima deserunt evertitur ne qui, nam reprimique appellantur ne.",
+ "user_id": 1
+ },
+ {
+ "title": "Flask vs Django - Which Is Better?",
+ "content": "Ei dicta apeirian deterruisset eam, cu offendit invenire pri, cu possim vivendo vix? Nam nihil evertitur ad, ne vim nonumy legendos iracundia. Vix nulla dolorem intellegebat ea? Te per vide paulo dolor, eum ea erant placerat constituam? Dolores accumsan eum at.\r\n\r\nInteresset consequuntur id vix. Eam id decore latine, iusto imperdiet ei qui. In ludus consul reformidans eam. Nec in recusabo posidonium, cu tantas volumus mnesarchum pro. Nam ut docendi evertitur, possim menandri persecuti ne sed, cum saepe ornatus delenit ei?\r\n\r\nIn mel debet aliquam. In his etiam legere, doming nominavi consetetur has ad, decore reprimique ea usu. Eam magna graeci suavitate cu, facete delenit cum ne. Ponderum evertitur tincidunt ei mel, ius ei stet euismod docendi.",
+ "user_id": 2
+ },
+ {
+ "title": "You Won't Believe These Clickbait Titles!",
+ "content": "Cu justo honestatis mel, pro ei appareat mediocrem suavitate. No his omnis ridens. Ludus ornatus voluptatum mei ut, an mentitum noluisse forensibus cum. Eam affert pertinax consequuntur ei, nisl zril meliore te vis? Ad animal persius concludaturque vix, eu graece audiam mel.\r\n\r\nVitae libris mentitum pri in. Cu rebum veritus sea, ex usu consul dolorum, pro tale maluisset consulatu ut. Quo ad clita persius ancillae. Vel illud blandit at, vel eu hinc graeco, usu doctus praesent ea! Vim rebum deserunt ex.\r\n\r\nIus lorem omittam id, est suavitate definitionem ad! Id vim insolens tacimates, pri at decore causae. Ex duo bonorum repudiandae? Vix no vidit facete impedit. An oportere indoctum eam.",
+ "user_id": 2
+ },
+ {
+ "title": "These Beers Will Improve Your Programming",
+ "content": "Sanctus senserit vis id, ut eum iuvaret invidunt constituam? Nonumes facilis mei an, ad elit explicari persequeris pri, dico recusabo quo id? At mea lorem repudiandae. Sed causae sensibus forensibus ea, ne ornatus suscipiantur consectetuer mel, affert nostro nominati cu qui. Te sanctus constituto est, corrumpit pertinacia eos et, mei libris persequeris an.\r\n\r\nQuo fuisset sensibus in. Ad est assueverit adversarium, viris aperiri numquam est ad. Pro mediocrem iudicabit ei! Cu aperiam diceret sit.",
+ "user_id": 1
+ },
+ {
+ "title": "List of PyCon 2018 Talks",
+ "content": "Has ea verear adolescens, elit justo constituam duo in, vix an copiosae contentiones. Eos persius consequuntur no, esse percipit cum ea, per modus harum praesent at. Et clita delenit luptatum usu? No cum interpretaris concludaturque. Congue pertinax ea mea.\r\n\r\nBrute iracundia philosophia ei quo, nam at adhuc idque, ex dolor homero mei. No mea affert tacimates pertinacia, in maluisset dissentias consectetuer mei, vel no aliquam splendide. In has nobis vocent adipisci? Pri clita delicata in, iusto viris scripserit vim in? Sit in lorem complectitur. Sanctus eloquentiam eum ut, et sumo apeirian mea? Vim te affert populo voluptaria, utinam consul ad duo.",
+ "user_id": 1
+ },
+ {
+ "title": "How Dogs in the Workplace Boosts Productivity",
+ "content": "Has ea verear adolescens, elit justo constituam duo in, vix an copiosae contentiones. Eos persius consequuntur no, esse percipit cum ea, per modus harum praesent at. Et clita delenit luptatum usu? No cum interpretaris concludaturque. Congue pertinax ea mea.\r\n\r\nBrute iracundia philosophia ei quo, nam at adhuc idque, ex dolor homero mei. No mea affert tacimates pertinacia, in maluisset dissentias consectetuer mei, vel no aliquam splendide. In has nobis vocent adipisci? Pri clita delicata in, iusto viris scripserit vim in? Sit in lorem complectitur. Sanctus eloquentiam eum ut, et sumo apeirian mea? Vim te affert populo voluptaria, utinam consul ad duo.",
+ "user_id": 1
+ },
+ {
+ "title": "The Best Programming Podcasts",
+ "content": "Vidisse malorum platonem vel no. Persecuti adversarium ut sit, quo et stet velit mundi! Id per homero expetenda. Est brute adipisci et!\r\n\r\nLorem aliquip has in, quo debet ceteros sadipscing ne! An sea odio ornatus inermis, an per ipsum persecuti dissentiunt, no mea bonorum pertinacia delicatissimi? Ne sumo diceret mea, percipit repudiare eam no! Pro et lorem accommodare. At eius novum phaedrum mei?\r\n\r\nIgnota conclusionemque mei no, eam ut munere fierent pertinacia. Ea enim insolens gloriatur duo, quis vituperatoribus pro no! Ei sed bonorum reprehendunt, aliquam nominavi his et. Magna decore referrentur id nec. Cum rebum ludus inimicus no, id cum iusto labores maluisset!\r\n\r\nQui no omnis numquam apeirian, et vide interesset cum? Et nec nulla signiferumque. Enim instructior eos ei, solum tollit phaedrum his in? No vix malorum ornatus, cu quo hinc everti iracundia, essent eruditi efficiendi ut nam. Altera saperet usu eu, errem expetenda cu duo. Has dolor splendide et, no mel cibo ancillae voluptatum, mutat antiopam deterruisset ei qui. Dolores scripserit concludaturque est id, ea animal facilisi splendide qui, quo at animal voluptua instructior.\r\n\r\nMeis voluptatum eu eum.",
+ "user_id": 1
+ },
+ {
+ "title": "Tips for Public Speaking",
+ "content": "Ex eam doctus accommodare. Ut oratio vivendo intellegebat qui. Ius ne doming petentium. Pri congue delectus ad, accumsan molestiae disputando te mea. Nam case inani eligendi at, per te esse iudico. Feugiat patrioque mei ad, harum mundi adversarium an per!\r\n\r\nAncillae verterem eleifend his at? Nam vidit iusto petentium at, vis nusquam dissentias cu, etiam doctus adversarium eam no. At alterum definiebas efficiantur eos, pro labitur vituperatoribus ne, eu odio legere vim. Ad nec verear appellantur? Ad qui vulputate persequeris.",
+ "user_id": 2
+ },
+ {
+ "title": "Best Programmers Throughout History",
+ "content": "Mel nulla legimus senserit id. Vim purto tractatos in, te vix error regione, erant laudem legere an vel. Falli fierent ius ex! In legere iriure est, id vis prima maluisset, purto numquam inimicus ut eos! In duo antiopam salutatus, an vel quodsi virtute definitiones.\r\n\r\nEst te sumo voluptaria, ius no putant argumentum, alienum ocurreret vim cu? Volumus democritum no vel, virtute commune an est. Vel te propriae lobortis rationibus, no eum odio neglegentur? Duo an sumo ignota latine! Nec mazim aperiam percipitur eu, id his dicit omnium.",
+ "user_id": 2
+ },
+ {
+ "title": "How To Create A YouTube Channel",
+ "content": "Sit et novum omnes. Nec ea quas minim tractatos, usu in aperiam mentitum necessitatibus, ut omnis equidem moderatius quo. Eos ad putent aeterno praesent. Eos omnium similique id, his accommodare philosophia at. Causae lucilius similique in mea, ut regione tritani voluptatibus mel! At possim offendit eum, aeque denique prodesset pro te?\r\n\r\nAt pro quem laudem. Et agam democritum eos? Ea quod probatus usu, no ferri fabulas cotidieque mei? Numquam nusquam quo in, quo et molestiae complectitur. Nihil semper ei qui.\r\n\r\nModo omnes forensibus duo ex, te est diceret bonorum labores! Magna ponderum eos ea. Cu vim diceret mnesarchum, graeci periculis in vis. Est no iriure suavitate!",
+ "user_id": 2
+ },
+ {
+ "title": "How I Record My Videos",
+ "content": "Ad vel possim delicatissimi, delectus detraxit per cu. Ad pri vidit modus altera! In erat complectitur sit, quo no nostro insolens? Aliquam patrioque scribentur quo ad, partem commune eos at. Eius vivendo comprehensam has ne, sea ne eros mazim oratio. Soluta populo te duo, ne pro causae fabulas percipitur, feugiat.",
+ "user_id": 1
+ },
+ {
+ "title": "Python and Physics",
+ "content": "Agam mediocritatem sed ex, fabellas recusabo dissentias vix te. No principes consequat inciderint pri, ea mundi affert persecuti mea, ne usu veri regione nostrum! An tibique dissentiet referrentur pro, ridens temporibus eu est! Ius ne omnes affert rationibus, ut detraxit qualisque usu. Accusamus reformidans sea id?\r\n\r\nEu aliquip gloriatur mei. Qui ad sint scripserit? Te instructior definitiones mel, sale mutat everti at his. Ea mea quot recusabo philosophia. Et nam quod adipisci, quo atqui appetere recusabo id, detraxit inimicus vim.",
+ "user_id": 1
+ },
+ {
+ "title": "Just A Few More Healines Should Do It",
+ "content": "Duo at tibique commune vulputate, ex facilis tacimates disputationi mei. Mel eu inani prompta labores! Audire omnesque offendit ex eos. An ferri accusata his, vel agam habeo maiestatis ex, eam mutat iisque concludaturque ut. Ut tamquam minimum partiendo vim. An nam vidit doming graecis.\r\n\r\nSingulis abhorreant his in, et altera audiam feugiat mei. Pri eius dolor persequeris id! Nam ea dolorem expetendis, idque everti suscipit qui te, noster repudiare dignissim per ex? No vim iriure tibique comprehensam, per utamur consequat.",
+ "user_id": 1
+ },
+ {
+ "title": "Music To Listen To While Coding",
+ "content": "Feugait reprimique eu mel, te eum dico electram. Nam no nemore cotidieque. Vim cu suas atqui dicunt. Id labitur dissentiunt per, ignota maiorum pri no? Clita altera sanctus ex his!\r\n\r\nAt alia electram reprehendunt eam, sea te volumus quaestio. Commodo voluptua senserit ius ne, eu enim disputationi eam? Id pri omnium blandit, nullam denique nec no? Sapientem vituperata sit et, nisl facilisis periculis in est. Elaboraret accommodare id vel? Cibo eripuit ut has, sed cu liber invidunt.\r\n\r\nEi pro vide quas dolorum, sea no fugit sanctus neglegentur. Sit feugait disputationi ne. Id diceret periculis nec, sint nonumes in sea, cum.",
+ "user_id": 1
+ },
+ {
+ "title": "5 Tips for Writing Catchy Headlines",
+ "content": "Ea homero possit epicuri est, debitis docendi tacimates cu duo? Ad lorem cetero disputando pri, veniam eruditi tacimates per te.",
+ "user_id": 2
+ },
+ {
+ "title": "The Rise of Data Science",
+ "content": "Per omittam placerat at. Eius aeque ei mei. Usu ex partiendo salutandi. Pro illud placerat molestiae ex, habeo vidisse voluptatum cu vel, efficiendi accommodare eum ea! Ne has case minimum facilisis, pertinax efficiendi eu vel!\r\n\r\nEt movet semper assueverit his. Mei at liber vitae. Vix et periculis definiebas, vero falli.",
+ "user_id": 2
+ },
+ {
+ "title": "Best Videos For Learning Python",
+ "content": "Mei ei mazim dicunt feugait? Ludus mandamus ne est, per ne iusto facilisis moderatius! Has agam utamur ad! Ius reque aeterno cu, fabellas facilisi repudiare eu sit, te cibo convenire similique est. Ea cum viderer imperdiet liberavisse.\r\n\r\nPro minim iuvaret ad. No nam ornatus principes euripidis, at sale vituperatoribus eos, eros regione scripserit id mea. Has ne inermis nostrum, quo tantas melius dissentias at! Ut vim tibique omnesque. An mel modo ponderum, eum at probo appetere imperdiet? Natum quaeque intellegebat per ex. Cu viris clita sit?\r\n\r\nReque menandri dissentias sed ne, no tota nonumes eos, vix in tempor maiestatis erant.",
+ "user_id": 1
+ },
+ {
+ "title": "Top 10 Python Tips and Tricks",
+ "content": "Pro minim iuvaret ad. No nam ornatus principes euripidis, at sale vituperatoribus eos, eros regione scripserit id mea. Has ne inermis nostrum, quo tantas melius dissentias at! Ut vim tibique omnesque. An mel modo ponderum, eum at probo appetere imperdiet? Natum quaeque intellegebat per ex. Cu viris clita sit?\r\n\r\nReque menandri dissentias sed ne, no tota nonumes eos, vix in tempor maiestatis erant.",
+ "user_id": 1
+ },
+ {
+ "title": "Top 5 YouTube Channels For Learning Programming",
+ "content": "Quo inani quando ea, mel an vide adversarium suscipiantur. Et dicunt eleifend splendide pro. Nibh animal dolorem vim ex, nec te agam referrentur. Usu admodum ocurreret ne.\r\n\r\nEt dico audire cotidieque sed, cibo latine ut has, an case magna alienum.",
+ "user_id": 2
+ },
+ {
+ "title": "My Latest Updated Post",
+ "content": "Erat expetenda definitionem id eos. Semper suscipit eum ut, eum ex nemore copiosae. Nam probatus pertinacia eu! No alii voluptua abhorreant nec, te pro impedit concludaturque, in sea malis torquatos disputationi! Nam te alii nobis ponderum, ei fugit accusamus pro.\r\n\r\nCongue salutandi ex eam! Mei an prima consulatu, erat detracto eu quo? Vim ea esse utinam efficiantur, at noster dicunt.",
+ "user_id": 1
+ }
+]
diff --git a/django_project/users/__init__.py b/django_project/users/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/django_project/users/__pycache__/__init__.cpython-37.pyc b/django_project/users/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..b28deb1
Binary files /dev/null and b/django_project/users/__pycache__/__init__.cpython-37.pyc differ
diff --git a/django_project/users/__pycache__/__init__.cpython-38.pyc b/django_project/users/__pycache__/__init__.cpython-38.pyc
new file mode 100644
index 0000000..8a026ed
Binary files /dev/null and b/django_project/users/__pycache__/__init__.cpython-38.pyc differ
diff --git a/django_project/users/__pycache__/admin.cpython-37.pyc b/django_project/users/__pycache__/admin.cpython-37.pyc
new file mode 100644
index 0000000..546ba96
Binary files /dev/null and b/django_project/users/__pycache__/admin.cpython-37.pyc differ
diff --git a/django_project/users/__pycache__/admin.cpython-38.pyc b/django_project/users/__pycache__/admin.cpython-38.pyc
new file mode 100644
index 0000000..0c69353
Binary files /dev/null and b/django_project/users/__pycache__/admin.cpython-38.pyc differ
diff --git a/django_project/users/__pycache__/apps.cpython-37.pyc b/django_project/users/__pycache__/apps.cpython-37.pyc
new file mode 100644
index 0000000..f110d29
Binary files /dev/null and b/django_project/users/__pycache__/apps.cpython-37.pyc differ
diff --git a/django_project/users/__pycache__/apps.cpython-38.pyc b/django_project/users/__pycache__/apps.cpython-38.pyc
new file mode 100644
index 0000000..44a7329
Binary files /dev/null and b/django_project/users/__pycache__/apps.cpython-38.pyc differ
diff --git a/django_project/users/__pycache__/forms.cpython-37.pyc b/django_project/users/__pycache__/forms.cpython-37.pyc
new file mode 100644
index 0000000..cd2cee7
Binary files /dev/null and b/django_project/users/__pycache__/forms.cpython-37.pyc differ
diff --git a/django_project/users/__pycache__/forms.cpython-38.pyc b/django_project/users/__pycache__/forms.cpython-38.pyc
new file mode 100644
index 0000000..313d6ae
Binary files /dev/null and b/django_project/users/__pycache__/forms.cpython-38.pyc differ
diff --git a/django_project/users/__pycache__/models.cpython-37.pyc b/django_project/users/__pycache__/models.cpython-37.pyc
new file mode 100644
index 0000000..5fc6296
Binary files /dev/null and b/django_project/users/__pycache__/models.cpython-37.pyc differ
diff --git a/django_project/users/__pycache__/models.cpython-38.pyc b/django_project/users/__pycache__/models.cpython-38.pyc
new file mode 100644
index 0000000..6c4f548
Binary files /dev/null and b/django_project/users/__pycache__/models.cpython-38.pyc differ
diff --git a/django_project/users/__pycache__/signals.cpython-37.pyc b/django_project/users/__pycache__/signals.cpython-37.pyc
new file mode 100644
index 0000000..50eccec
Binary files /dev/null and b/django_project/users/__pycache__/signals.cpython-37.pyc differ
diff --git a/django_project/users/__pycache__/signals.cpython-38.pyc b/django_project/users/__pycache__/signals.cpython-38.pyc
new file mode 100644
index 0000000..e5396fa
Binary files /dev/null and b/django_project/users/__pycache__/signals.cpython-38.pyc differ
diff --git a/django_project/users/__pycache__/views.cpython-37.pyc b/django_project/users/__pycache__/views.cpython-37.pyc
new file mode 100644
index 0000000..46c0061
Binary files /dev/null and b/django_project/users/__pycache__/views.cpython-37.pyc differ
diff --git a/django_project/users/__pycache__/views.cpython-38.pyc b/django_project/users/__pycache__/views.cpython-38.pyc
new file mode 100644
index 0000000..4b8cf66
Binary files /dev/null and b/django_project/users/__pycache__/views.cpython-38.pyc differ
diff --git a/django_project/users/admin.py b/django_project/users/admin.py
new file mode 100644
index 0000000..d914f1f
--- /dev/null
+++ b/django_project/users/admin.py
@@ -0,0 +1,4 @@
+from django.contrib import admin
+from .models import Profile
+
+admin.site.register(Profile)
diff --git a/django_project/users/apps.py b/django_project/users/apps.py
new file mode 100644
index 0000000..b8d67f1
--- /dev/null
+++ b/django_project/users/apps.py
@@ -0,0 +1,8 @@
+from django.apps import AppConfig
+
+
+class UsersConfig(AppConfig):
+ name = 'users'
+
+ def ready(self):
+ import users.signals
diff --git a/django_project/users/forms.py b/django_project/users/forms.py
new file mode 100644
index 0000000..ee5757a
--- /dev/null
+++ b/django_project/users/forms.py
@@ -0,0 +1,26 @@
+from django import forms
+from django.contrib.auth.models import User
+from django.contrib.auth.forms import UserCreationForm
+from .models import Profile
+
+
+class UserRegisterForm(UserCreationForm):
+ email = forms.EmailField()
+
+ class Meta:
+ model = User
+ fields = ['username', 'email', 'password1', 'password2']
+
+
+class UserUpdateForm(forms.ModelForm):
+ email = forms.EmailField()
+
+ class Meta:
+ model = User
+ fields = ['username', 'email']
+
+
+class ProfileUpdateForm(forms.ModelForm):
+ class Meta:
+ model = Profile
+ fields = ['image']
diff --git a/django_project/users/migrations/0001_initial.py b/django_project/users/migrations/0001_initial.py
new file mode 100644
index 0000000..c549982
--- /dev/null
+++ b/django_project/users/migrations/0001_initial.py
@@ -0,0 +1,25 @@
+# Generated by Django 2.1 on 2018-08-28 21:29
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Profile',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('image', models.ImageField(default='default.jpg', upload_to='profile_pics')),
+ ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
+ ],
+ ),
+ ]
diff --git a/django_project/users/migrations/__init__.py b/django_project/users/migrations/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/django_project/users/migrations/__pycache__/0001_initial.cpython-37.pyc b/django_project/users/migrations/__pycache__/0001_initial.cpython-37.pyc
new file mode 100644
index 0000000..39a576d
Binary files /dev/null and b/django_project/users/migrations/__pycache__/0001_initial.cpython-37.pyc differ
diff --git a/django_project/users/migrations/__pycache__/0001_initial.cpython-38.pyc b/django_project/users/migrations/__pycache__/0001_initial.cpython-38.pyc
new file mode 100644
index 0000000..5c5d495
Binary files /dev/null and b/django_project/users/migrations/__pycache__/0001_initial.cpython-38.pyc differ
diff --git a/django_project/users/migrations/__pycache__/__init__.cpython-37.pyc b/django_project/users/migrations/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..cf95d4d
Binary files /dev/null and b/django_project/users/migrations/__pycache__/__init__.cpython-37.pyc differ
diff --git a/django_project/users/migrations/__pycache__/__init__.cpython-38.pyc b/django_project/users/migrations/__pycache__/__init__.cpython-38.pyc
new file mode 100644
index 0000000..fdba7a6
Binary files /dev/null and b/django_project/users/migrations/__pycache__/__init__.cpython-38.pyc differ
diff --git a/django_project/users/models.py b/django_project/users/models.py
new file mode 100644
index 0000000..75181a0
--- /dev/null
+++ b/django_project/users/models.py
@@ -0,0 +1,21 @@
+from django.db import models
+from django.contrib.auth.models import User
+from PIL import Image
+
+
+class Profile(models.Model):
+ user = models.OneToOneField(User, on_delete=models.CASCADE)
+ image = models.ImageField(default='default.jpg', upload_to='profile_pics')
+
+ def __str__(self):
+ return f'{self.user.username} Profile'
+
+ def save(self,*args, **kwargs):
+ super().save(*args, **kwargs)
+
+ img = Image.open(self.image.path)
+
+ if img.height > 300 or img.width > 300:
+ output_size = (300, 300)
+ img.thumbnail(output_size)
+ img.save(self.image.path)
diff --git a/django_project/users/signals.py b/django_project/users/signals.py
new file mode 100644
index 0000000..299e44a
--- /dev/null
+++ b/django_project/users/signals.py
@@ -0,0 +1,15 @@
+from django.db.models.signals import post_save
+from django.contrib.auth.models import User
+from django.dispatch import receiver
+from .models import Profile
+
+
+@receiver(post_save, sender=User)
+def create_profile(sender, instance, created, **kwargs):
+ if created:
+ Profile.objects.create(user=instance)
+
+
+@receiver(post_save, sender=User)
+def save_profile(sender, instance, **kwargs):
+ instance.profile.save()
diff --git a/django_project/users/templates/users/login.html b/django_project/users/templates/users/login.html
new file mode 100644
index 0000000..e726d1a
--- /dev/null
+++ b/django_project/users/templates/users/login.html
@@ -0,0 +1,24 @@
+{% extends "blog/base.html" %}
+{% load crispy_forms_tags %}
+{% block content %}
+