diff --git a/mysite/db.sqlite3 b/mysite/db.sqlite3 index 3edef0f..da0d47d 100644 Binary files a/mysite/db.sqlite3 and b/mysite/db.sqlite3 differ diff --git a/mysite/main/models.py b/mysite/main/models.py index d5e2fe3..122955b 100644 --- a/mysite/main/models.py +++ b/mysite/main/models.py @@ -2,7 +2,7 @@ # Create your models here. class ToDoList(models.Model): - date = models.DateTimeField("date published") + date = models.DateTimeField("date published", auto_now_add=True) name = models.CharField(max_length=200) def __str__(self): diff --git a/mysite/main/templates/main/index.html b/mysite/main/templates/main/index.html index 89d073f..b7a6f52 100644 --- a/mysite/main/templates/main/index.html +++ b/mysite/main/templates/main/index.html @@ -1,31 +1,65 @@ +{#{% extends 'main/base.html' %}#} +{##} +{#{% block title %}View List{% endblock %}#} +{##} +{#{% block content %}#} +{#

{{ls.name}}

#} +{#
#} +{# {% csrf_token %}#} +{##} +{# {% for item in ls.item_set.all%}#} +{#
#} +{#
#} +{#
#} +{# #} +{#
#} +{#
#} +{# #} +{#
#} +{# {% endfor %}#} +{##} +{#
#} +{#
#} +{# #} +{#
#} +{# #} +{# #} +{#
#} +{#
#} +{# #} +{#
#} +{#{% endblock %}#} + {% extends 'main/base.html' %} {% block title %}View List{% endblock %} {% block content %} -

{{ls.name}}

-
- {% csrf_token %} +

{{ls.name}}

+ + {% csrf_token %} - {% for item in ls.item_set.all%} -
-
-
- -
-
- -
- {% endfor %} + {% for item in ls.item_set.all%} +
+
+
+ +
+
+ +
+ +
+
+ {% endfor %} -
-
- -
- - -
-
- -
-{% endblock %} \ No newline at end of file +
+
+ +
+ +
+
+ + +{% endblock %} diff --git a/mysite/main/templates/main/view.html b/mysite/main/templates/main/view.html index 6b6bb02..ea95e6a 100644 --- a/mysite/main/templates/main/view.html +++ b/mysite/main/templates/main/view.html @@ -1,16 +1,81 @@ +{#{% extends 'main/base.html' %}#} +{##} +{#{% block title %}View All Lists{% endblock %}#} +{##} +{#{% block content %}#} +{#
#} +{# {% if user.is_authenticated %}#} +{#

My list items

#} +{# {% if lists %}#} +{#
#} +{# {% for l in lists %}#} +{# #} +{#

{{l.name}}

#} +{#
#} +{# {% endfor %}#} +{#
#} +{# {% else %}#} +{#
#} +{# You haven't created any lists yet.#} +{#
#} +{# {% endif %}#} +{# {% else %}#} +{#
#} +{#
#} +{#

Welcome to the list management system

#} +{#

Please log in or register to start using our services

#} +{#
#} +{# Login#} +{#
#} +{# Register#} +{#
#} +{#
#} +{#
#} +{# {% endif %}#} +{#
#} +{#{% endblock %}#} + + {% extends 'main/base.html' %} {% block title %}View All Lists{% endblock %} - {% block content %} - {% if user.is_authenticated %} - - {% else %} -

Login Here

- {% endif %} -{% endblock %} \ No newline at end of file +
+ {% if user.is_authenticated %} +

My list items

+ {% if lists %} +
+ {% for l in lists %} +
+ +

{{l.name}}

+
+
+ {% csrf_token %} + +
+
+ {% endfor %} +
+ {% else %} +
+ You haven't created any lists yet. +
+ {% endif %} + {% else %} +
+
+

Welcome to the list management system

+

Please log in or register to start using our services

+
+ Login +
+ Register +
+
+
+ {% endif %} +
+{% endblock %} + diff --git a/mysite/main/urls.py b/mysite/main/urls.py index 329623f..315a5fb 100644 --- a/mysite/main/urls.py +++ b/mysite/main/urls.py @@ -8,4 +8,6 @@ path("home/", views.home, name="home"), path("create/", views.get_name, name="index"), path("", views.index, name="index"), +path('delete//', views.delete_list, name='delete_list'), + ] diff --git a/mysite/main/views.py b/mysite/main/views.py index bb6c1b3..3d7f8cd 100644 --- a/mysite/main/views.py +++ b/mysite/main/views.py @@ -31,6 +31,11 @@ def index(request, id): else: print("invalid") + elif "delete" in request.POST: + item_id = int(request.POST["delete"]) + item = ls.item_set.get(id=item_id) + item.delete() + return render(request, "main/index.html", {"ls": ls}) @@ -58,3 +63,11 @@ def home(request): def view(request): l = ToDoList.objects.all() return render(request, "main/view.html", {"lists":l}) + +def delete_list(request, id): + if request.method == "POST": + ls = get_object_or_404(ToDoList, id=id) + ls.delete() + return HttpResponseRedirect("/view") # 重定向到清单列表页面 + return HttpResponseRedirect("/view") # 如果不是POST请求,也重定向到列表页面 + diff --git a/mysite/mysite/settings.py b/mysite/mysite/settings.py index 587243e..4301e76 100644 --- a/mysite/mysite/settings.py +++ b/mysite/mysite/settings.py @@ -40,6 +40,7 @@ 'main.apps.MainConfig', "register.apps.RegisterConfig", "crispy_forms", + 'crispy_bootstrap4' ] AUTH_USER_MODEL = "register.CustomUser" diff --git a/mysite/mysite/urls.py b/mysite/mysite/urls.py index 5ac6cdf..a2c26ae 100644 --- a/mysite/mysite/urls.py +++ b/mysite/mysite/urls.py @@ -16,10 +16,12 @@ from django.contrib import admin from django.urls import path, include from register import views as v +from django.contrib.auth import views as auth_views urlpatterns = [ path('admin/', admin.site.urls), path("register/", v.register, name="register"), + path('logout/', auth_views.LogoutView.as_view(next_page='/'), name='logout'), path('', include("main.urls")), path('', include("django.contrib.auth.urls")) ] diff --git a/mysite/register/migrations/0001_initial.py b/mysite/register/migrations/0001_initial.py index c125840..6d85251 100644 --- a/mysite/register/migrations/0001_initial.py +++ b/mysite/register/migrations/0001_initial.py @@ -1,47 +1,47 @@ -# Generated by Django 2.2 on 2019-04-29 15:20 - -import django.contrib.auth.models -import django.contrib.auth.validators -from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('auth', '0011_update_proxy_permissions'), - ('main', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='CustomUser', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('password', models.CharField(max_length=128, verbose_name='password')), - ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), - ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), - ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), - ('first_name', models.CharField(blank=True, max_length=30, verbose_name='first name')), - ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), - ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')), - ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), - ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), - ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), - ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')), - ('toDoLists', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='main.ToDoList')), - ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')), - ], - options={ - 'verbose_name': 'user', - 'verbose_name_plural': 'users', - 'abstract': False, - }, - managers=[ - ('objects', django.contrib.auth.models.UserManager()), - ], - ), - ] +# Generated by Django 5.2.1 on 2025-05-21 16:37 + +import django.contrib.auth.models +import django.contrib.auth.validators +import django.db.models.deletion +import django.utils.timezone +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), + ('main', '__first__'), + ] + + operations = [ + migrations.CreateModel( + name='CustomUser', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('password', models.CharField(max_length=128, verbose_name='password')), + ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), + ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), + ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), + ('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')), + ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), + ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')), + ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), + ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), + ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), + ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')), + ('toDoLists', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='main.todolist')), + ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')), + ], + options={ + 'verbose_name': 'user', + 'verbose_name_plural': 'users', + 'abstract': False, + }, + managers=[ + ('objects', django.contrib.auth.models.UserManager()), + ], + ), + ] diff --git a/mysite/register/models.py b/mysite/register/models.py index 39e94a7..c8473d6 100644 --- a/mysite/register/models.py +++ b/mysite/register/models.py @@ -4,4 +4,4 @@ # Create your models here. class CustomUser(AbstractUser): - toDoLists = models.ForeignKey(ToDoList, on_delete=models.CASCADE) + pass \ No newline at end of file diff --git a/mysite/register/templates/register/register.html b/mysite/register/templates/register/register.html index 31d1b89..ddcf558 100644 --- a/mysite/register/templates/register/register.html +++ b/mysite/register/templates/register/register.html @@ -10,7 +10,10 @@ {% csrf_token %} Create an Account {{form|crispy}} +
+ Already have an account? Login +
{% endblock %} \ No newline at end of file diff --git a/mysite/register/templates/registration/login.html b/mysite/register/templates/registration/login.html index 877ed61..219b107 100644 --- a/mysite/register/templates/registration/login.html +++ b/mysite/register/templates/registration/login.html @@ -1,16 +1,39 @@ +{#{% extends "main/base.html"%}#} +{##} +{#{% block title%}#} +{#{% endblock %}#} +{##} +{#{% load crispy_forms_tags %}#} +{##} +{#{% block content %}#} +{#
#} +{#
#} +{# {% csrf_token %}#} +{# {{form|crispy}}#} +{# #} +{#
#} +{#
#} +{#{% endblock %}#} + + {% extends "main/base.html"%} {% block title%} +Login {% endblock %} {% load crispy_forms_tags %} {% block content %} -
-
- {% csrf_token %} - {{form|crispy}} - -
-
+
+
+ {% csrf_token %} + {{form|crispy}} +
+ + Do not have an account? Register +
+
+
{% endblock %} + diff --git a/mysite/register/views.py b/mysite/register/views.py index e3d96aa..01133c6 100644 --- a/mysite/register/views.py +++ b/mysite/register/views.py @@ -1,15 +1,16 @@ -from django.contrib.auth import login, authenticate -from django.contrib.auth.forms import UserCreationForm from django.shortcuts import render, redirect +from main.models import ToDoList +from .forms import RegisterForm + # Create your views here. def register(response): if response.method == "POST": - form = UserCreationForm(response.POST) + form = RegisterForm(response.POST) if form.is_valid(): form.save() return redirect("/home") else: - form = UserCreationForm() + form = RegisterForm() return render(response, "register/register.html", {"form":form}) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index f9dac8c..c581792 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ -django -django-crispy-forms +django==5.2.1 +django-crispy-forms==2.4 +crispy-bootstrap4==2024.10