numbero 1

This commit is contained in:
Flatlogic Bot 2025-12-08 02:33:51 +00:00
parent 6f60851c06
commit 5394b63ebb
11 changed files with 98 additions and 6 deletions

View File

@ -0,0 +1,28 @@
# Generated by Django 5.2.7 on 2025-12-08 02:30
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('core', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='ClubMembership',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('date_joined', models.DateTimeField(auto_now_add=True)),
('club', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.club')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
options={
'unique_together': {('user', 'club')},
},
),
]

View File

@ -1,4 +1,5 @@
from django.db import models from django.db import models
from django.contrib.auth.models import User
class Club(models.Model): class Club(models.Model):
name = models.CharField(max_length=100) name = models.CharField(max_length=100)
@ -21,4 +22,15 @@ class BookRecommendation(models.Model):
created_at = models.DateTimeField(auto_now_add=True) created_at = models.DateTimeField(auto_now_add=True)
def __str__(self): def __str__(self):
return f"{self.book_title} recommended for {self.club.name}" return f"{self.book_title} recommended for {self.club.name}"
class ClubMembership(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
club = models.ForeignKey(Club, on_delete=models.CASCADE)
date_joined = models.DateTimeField(auto_now_add=True)
class Meta:
unique_together = ('user', 'club')
def __str__(self):
return f"{self.user.username} joined {self.club.name}"

View File

@ -26,6 +26,9 @@
<div class="collapse navbar-collapse"> <div class="collapse navbar-collapse">
<ul class="navbar-nav ms-auto"> <ul class="navbar-nav ms-auto">
{% if user.is_authenticated %} {% if user.is_authenticated %}
<li class="nav-item">
<a class="nav-link" href="{% url 'club_list' %}">Clubs</a>
</li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="#">Hi, {{ user.username }}</a> <a class="nav-link" href="#">Hi, {{ user.username }}</a>
</li> </li>

View File

@ -0,0 +1,29 @@
{% extends 'base.html' %}
{% block content %}
<div class="container my-5">
<h2 class="text-center mb-4">All Clubs</h2>
{% if message %}
<div class="alert alert-success" role="alert">
{{ message }}
</div>
{% endif %}
<div class="row">
{% for club in clubs %}
<div class="col-md-4 mb-4">
<div class="card">
<div class="card-body">
<h5 class="card-title">{{ club.name }}</h5>
<p class="card-text">{{ club.description }}</p>
<form method="POST">
{% csrf_token %}
<input type="hidden" name="club_id" value="{{ club.id }}">
<button type="submit" class="btn btn-primary">Join Club</button>
</form>
</div>
</div>
</div>
{% endfor %}
</div>
</div>
{% endblock %}

View File

@ -15,7 +15,7 @@
<div class="container"> <div class="container">
<h1 class="display-4">Welcome to the Book Club</h1> <h1 class="display-4">Welcome to the Book Club</h1>
<p class="lead">Create or join a book club, discuss your favorite books, and connect with fellow readers.</p> <p class="lead">Create or join a book club, discuss your favorite books, and connect with fellow readers.</p>
<a href="#" class="btn btn-primary btn-lg">Join a Club</a> <a href="{% url 'club_list' %}" class="btn btn-primary btn-lg">Join a Club</a>
</div> </div>
</div> </div>

View File

@ -1,10 +1,11 @@
from django.urls import path from django.urls import path
from . import views from . import views
from .views import signup_view, login_view, logout_view from .views import signup_view, login_view, logout_view, club_list
urlpatterns = [ urlpatterns = [
path('', views.index, name='index'), path('', views.index, name='index'),
path('signup/', signup_view, name='signup'), path('signup/', signup_view, name='signup'),
path('login/', login_view, name='login'), path('login/', login_view, name='login'),
path('logout/', logout_view, name='logout'), path('logout/', logout_view, name='logout'),
path('clubs/', club_list, name='club_list'),
] ]

View File

@ -1,5 +1,6 @@
from django.shortcuts import render, redirect from django.shortcuts import render, redirect
from .models import Club, BookRecommendation from .models import Club, BookRecommendation, ClubMembership
from django.db import IntegrityError
import random import random
def index(request): def index(request):
@ -39,7 +40,8 @@ def index(request):
'captcha_error': captcha_error, 'captcha_error': captcha_error,
}) })
from django.contrib.auth import login, logout from django.contrib.auth import login, logout, get_user
from django.contrib.auth.decorators import login_required
from django.contrib.auth.forms import AuthenticationForm from django.contrib.auth.forms import AuthenticationForm
from .forms import SignUpForm from .forms import SignUpForm
@ -68,4 +70,21 @@ def login_view(request):
def logout_view(request): def logout_view(request):
if request.method == 'POST': if request.method == 'POST':
logout(request) logout(request)
return redirect('/') return redirect('/')
@login_required
def club_list(request):
if request.method == 'POST':
club_id = request.POST.get('club_id')
club = Club.objects.get(id=club_id)
user = get_user(request)
try:
ClubMembership.objects.create(user=user, club=club)
message = f"You have successfully joined {club.name}."
except IntegrityError:
message = f"You are already a member of {club.name}."
clubs = Club.objects.all()
return render(request, 'core/club_list.html', {'clubs': clubs, 'message': message})
clubs = Club.objects.all()
return render(request, 'core/club_list.html', {'clubs': clubs})