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

+ + + + 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

+
+ {% csrf_token %} + + +
+ + +
+ +
+

{{ 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

+
+ {% csrf_token %} + {{ form.as_p }} + +
+ + 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'), ]