diff --git a/blog/migrations/0004_alter_post_author.py b/blog/migrations/0004_alter_post_author.py
new file mode 100644
index 0000000..c8bb3f0
--- /dev/null
+++ b/blog/migrations/0004_alter_post_author.py
@@ -0,0 +1,21 @@
+# Generated by Django 5.1 on 2024-08-31 13:04
+
+import django.db.models.deletion
+from django.conf import settings
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('blog', '0003_rename_markdowncontent_post'),
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='post',
+ name='author',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
+ ),
+ ]
diff --git a/blog/models.py b/blog/models.py
index d7deab3..b8f40e3 100644
--- a/blog/models.py
+++ b/blog/models.py
@@ -1,11 +1,12 @@
# Create your models here.
from django.db import models
from django.utils import timezone
+from django.contrib.auth.models import User
class Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
- author = models.CharField(max_length=100,default='tbd')
+ author = models.ForeignKey(User, on_delete=models.CASCADE)
created_at = models.DateTimeField(default=timezone.now)
updated_at = models.DateTimeField(auto_now=True)
diff --git a/blog/templates/blog/base.html b/blog/templates/blog/base.html
index 3ee1fb5..57130bb 100644
--- a/blog/templates/blog/base.html
+++ b/blog/templates/blog/base.html
@@ -2,7 +2,7 @@
- My Blog
+ My Blog is shiny
My Blog
diff --git a/blog/templates/blog/dashboard.html b/blog/templates/blog/dashboard.html
new file mode 100644
index 0000000..3e33727
--- /dev/null
+++ b/blog/templates/blog/dashboard.html
@@ -0,0 +1,18 @@
+
+
+
+ Dashboard
+
+
+ Dashboard
+ Welcome, {{ request.user.username }}!
+ Logout
+ Your Posts
+
+ {% for post in posts %}
+ - {{ post.title }}
+ {% endfor %}
+
+
+
+
diff --git a/blog/templates/blog/login.html b/blog/templates/blog/login.html
new file mode 100644
index 0000000..e210dab
--- /dev/null
+++ b/blog/templates/blog/login.html
@@ -0,0 +1,20 @@
+
+
+
+ Login
+
+
+ Login
+
+ {{ error }}
+
+
diff --git a/blog/templates/blog/register.html b/blog/templates/blog/register.html
new file mode 100644
index 0000000..6dccc37
--- /dev/null
+++ b/blog/templates/blog/register.html
@@ -0,0 +1,14 @@
+
+
+
+ Register
+
+
+ Register
+
+
+
diff --git a/blog/views.py b/blog/views.py
index cf22f83..e1bedf9 100644
--- a/blog/views.py
+++ b/blog/views.py
@@ -1,6 +1,9 @@
-from django.shortcuts import render
+from django.shortcuts import render , redirect
from .models import Post
+from django.contrib.auth import authenticate, login, logout
+from django.contrib.auth.decorators import login_required
+from django.contrib.auth.forms import UserCreationForm
def home(request):
posts = Post.objects.all()
@@ -9,3 +12,34 @@ def home(request):
def post_detail(request, pk):
post = Post.objects.get(pk=pk)
return render(request, 'blog/post_detail.html', {'post': post})
+
+def login_view(request):
+ if request.method == 'POST':
+ username = request.POST['username']
+ password = request.POST['password']
+ user = authenticate(request, username=username, password=password)
+ if user is not None:
+ login(request, user)
+ return redirect('dashboard')
+ else:
+ return render(request, 'blog/login.html', {'error': 'Invalid credentials'})
+ return render(request, 'blog/login.html')
+
+def logout_view(request):
+ logout(request)
+ return redirect('login')
+
+@login_required
+def dashboard(request):
+ posts = Post.objects.filter(author=request.user)
+ return render(request, 'blog/dashboard.html', {'posts': posts})
+
+def register(request):
+ if request.method == 'POST':
+ form = UserCreationForm(request.POST)
+ if form.is_valid():
+ form.save()
+ return redirect('login')
+ else:
+ form = UserCreationForm()
+ return render(request, 'blog/register.html', {'form': form})
diff --git a/django_mblog/settings.py b/django_mblog/settings.py
index 0dbd63f..83ce048 100644
--- a/django_mblog/settings.py
+++ b/django_mblog/settings.py
@@ -9,7 +9,7 @@ https://docs.djangoproject.com/en/5.1/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/5.1/ref/settings/
"""
-
+import os
from pathlib import Path
# Build paths inside the project like this: BASE_DIR / 'subdir'.
@@ -51,11 +51,13 @@ MIDDLEWARE = [
]
ROOT_URLCONF = 'django_mblog.urls'
+BASE_DIR = Path(__file__).resolve().parent.parent
+
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
- 'DIRS': [],
+ 'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
@@ -122,3 +124,9 @@ STATIC_URL = 'static/'
# https://docs.djangoproject.com/en/5.1/ref/settings/#default-auto-field
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
+
+
+# other settings
+LOGIN_URL = 'login'
+LOGIN_REDIRECT_URL = 'dashboard'
+
diff --git a/django_mblog/urls.py b/django_mblog/urls.py
index c17ace5..d11a4b2 100644
--- a/django_mblog/urls.py
+++ b/django_mblog/urls.py
@@ -22,4 +22,8 @@ urlpatterns = [
path('admin/', admin.site.urls),
path('', views.home, name='home'),
path('post//', views.post_detail, name='post_detail'),
+ path('login/', views.login_view, name='login'),
+ path('logout/', views.logout_view, name='logout'),
+ path('dashboard/', views.dashboard, name='dashboard'),
+ path('register/', views.register, name='register'),
]