From cf7b9c1430b7b94ae2b3e869b679598359204e86 Mon Sep 17 00:00:00 2001 From: andy <2768054177@qq.com> Date: Wed, 21 May 2025 23:34:01 +0800 Subject: [PATCH 1/5] update requirements.txt --- requirements.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 From be797b8ba290e7a489379df5a516db0e9ca41941 Mon Sep 17 00:00:00 2001 From: andy <2768054177@qq.com> Date: Wed, 21 May 2025 23:49:26 +0800 Subject: [PATCH 2/5] 1. update register/login UI. 2. update register/login logic. --- mysite/db.sqlite3 | Bin 147456 -> 147456 bytes mysite/main/models.py | 2 +- mysite/main/templates/main/view.html | 59 ++++++++++++++---- mysite/mysite/settings.py | 1 + mysite/register/models.py | 2 +- .../register/templates/register/register.html | 3 + .../templates/registration/login.html | 37 ++++++++--- mysite/register/views.py | 14 +++-- 8 files changed, 93 insertions(+), 25 deletions(-) diff --git a/mysite/db.sqlite3 b/mysite/db.sqlite3 index 3edef0fbb559a4f5fb604fa0235273c8f59f44dc..a8e76a0538b21addaa79c8bd7c7b6965bc0367b7 100644 GIT binary patch delta 1260 zcmah|Pi)&%7`JP?#1ZY+(ZUV`nvSALOiBHo|HO_!)J?0TS-mW2(~Mq%lemprJMLnq z`EzLpyKw>afVd%X;(}n|G-(n?q#c;pWfFr)lQ_^F5C^owcHqU8x&lHxJ%9T2{QG{N zf8X!<;DA3k;6FY`%b&cO=42|d_t7`?&w-hW9v!|gabYBSG(Z!#qPgr8N4;Fu&34cb z1cWQ56IiWE+b3buZuvo_X}VU$HMCD5#S&Hr(z(0r zR0MJ~{04X727CpdK^5AN8_dKoaIZuekw3h~Po6&$VJ^_FX*Vl@SN9y-54bU&nLa+U z1IryfyfODSyhQzN9sV#UOiqoFGY+y8{0z6?QwShS*cI4+i(@JM&C_2erzDg@VnPyR z87GZiY}hO|>^8#^?Br=|s6>(zswk-#lDv`uWbbURbay zcE)MOv69*8cU}Lg8NaNnc2T-kOp7_Rw7QiIT)8Q3G%`4-nStC}&v!4$hVSp~HFnch zyNLB{u-G<)eXU=XYq_|Y?d*u}#rwO(%|N@N<(2J%f}|BsDfU)#t#oOzXnOT!J+r%7 z?C*KDv8?;Kvft|EmX_4CTQI8W6~$;)x7z*wLcN6Y3!M~dXPpfzwbon6YH_*L_V)1d zH$ht$}O}U_xq(|6O_0h#n6doJ0eR%yfM(6*#!(Y~nJ&OPU delta 154 zcmV;L0A>GxfC+$r36L8BAdwtH1t0(}FgmehpbrBR3pA4l5GS)CAO;JwG#k(a5Cso} z01xR8&<}(Ut`C_Hf3qP#ZVv)42$O^_JP#8HVRdw9UvOn|ZE16JX_L<{Fai?|w*epl z{~xm81Q4SHU@)@;;0F)^3bPTg?+=ks1*R|o5VF7ou(Jf<{4b*5FtXqTFr@?n5VZsX I{12kwAb`3tdjJ3c 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/view.html b/mysite/main/templates/main/view.html index 6b6bb02..7ac8fa9 100644 --- a/mysite/main/templates/main/view.html +++ b/mysite/main/templates/main/view.html @@ -1,16 +1,53 @@ +{#{% extends 'main/base.html' %}#} +{##} +{#{% block title %}View All Lists{% endblock %}#} +{##} +{##} +{#{% block content %}#} +{# {% if user.is_authenticated %}#} +{#
    #} +{# {% for l in lists %}#} +{#
  • {{l.name}}

  • #} +{# {% endfor %}#} +{#
#} +{# {% else %}#} +{#

Login Here

#} +{# {% endif %}#} +{#{% endblock %}#} + {% extends 'main/base.html' %} {% block title %}View All Lists{% endblock %} - {% block content %} - {% if user.is_authenticated %} -
    - {% for l in lists %} -
  • {{l.name}}

  • - {% endfor %} -
- {% 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}}

+
+ {% 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/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/register/models.py b/mysite/register/models.py index 39e94a7..23aa12b 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) + toDoLists = models.ForeignKey(ToDoList, on_delete=models.CASCADE, null=True, blank=True) 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..ddea66f 100644 --- a/mysite/register/views.py +++ b/mysite/register/views.py @@ -1,15 +1,19 @@ -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() + user = form.save(commit=False) + default_list = ToDoList.objects.create(name="My todo list") + user.toDoLists = default_list + user.save() return redirect("/home") else: - form = UserCreationForm() + form = RegisterForm() return render(response, "register/register.html", {"form":form}) \ No newline at end of file From 021ee59ac7b5b3a5a37be51870f7ba0d80ff822e Mon Sep 17 00:00:00 2001 From: andy <2768054177@qq.com> Date: Thu, 22 May 2025 00:00:39 +0800 Subject: [PATCH 3/5] logout logic --- mysite/db.sqlite3 | Bin 147456 -> 147456 bytes mysite/main/templates/main/view.html | 50 +++++++++++++++++++++------ mysite/mysite/urls.py | 2 ++ 3 files changed, 41 insertions(+), 11 deletions(-) diff --git a/mysite/db.sqlite3 b/mysite/db.sqlite3 index a8e76a0538b21addaa79c8bd7c7b6965bc0367b7..3511dfbe38fbc5483889b8b8dc832c8a2eebd149 100644 GIT binary patch delta 72 zcmZo@;B08%oFL6;Hc`fz(X26{HGy$!0@D(H9tHsh2EN-23JeSk@|y)Wyyu_%|2`)Z T{~a)UVgUQ32OLcNk6=6i7^N5M delta 437 zcmaiwO;3Vg0DvLa!PaD*`?5OYcwc!5ydgRfBLYRsOM+6OBIXM!T(nyE`Uf5Q2d!Vx zty5c_{3W?{Zf(!?*|R;1MRKu7K5mofX-6W_ZR?>$zO~j~s7*5UMXX2@1hM~mkbY0i z?+(dz^}Z?!?Y7U)d=GlIGmV2W;IR-yEW&-a>$>nN<0!LwuYk2_Pt^0yrCS;dX~>oO z@yx^L7JVx6uEE|IQdR-Q>a`qrXqatwOE73#0gCF{tb$aGCzI|-azX=&a!?3WW-i1H z)K+Lqp7ygBbUZSy0^v;1xSq}d_QdCmsH%)5vtU?$r!1C6RU@AGu38qc(!k?LDHeIj z(^XqK;nbmh9ma9KV*)Kd&4ExJG@V>6%F61mO6x zF$QHC$0lSTq8W~6*fc;n7UWo%VT3Hh3mdCrB=t>D->+NGA5`Wjp(g)Z_UkMOYPoVg MslDBVnEbo&14|%=M*si- diff --git a/mysite/main/templates/main/view.html b/mysite/main/templates/main/view.html index 7ac8fa9..e16a26b 100644 --- a/mysite/main/templates/main/view.html +++ b/mysite/main/templates/main/view.html @@ -2,19 +2,40 @@ {##} {#{% block title %}View All Lists{% endblock %}#} {##} -{##} {#{% block content %}#} -{# {% if user.is_authenticated %}#} -{#
    #} -{# {% for l in lists %}#} -{#
  • {{l.name}}

  • #} -{# {% endfor %}#} -{#
#} -{# {% else %}#} -{#

Login Here

#} -{# {% endif %}#} +{#
#} +{# {% 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 %} @@ -22,7 +43,13 @@ {% block content %}
{% if user.is_authenticated %} -

My list items

+
+

My list items

+
+ {% csrf_token %} + +
+
{% if lists %}
{% for l in lists %} @@ -51,3 +78,4 @@

Welcome to the list management system

{% endif %}
{% endblock %} + 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")) ] From d767e7567620060cef438d7c6a2949b495385090 Mon Sep 17 00:00:00 2001 From: andy <2768054177@qq.com> Date: Thu, 22 May 2025 00:44:58 +0800 Subject: [PATCH 4/5] Remove todoList from database: a user can exist without a todolist --- mysite/db.sqlite3 | Bin 147456 -> 159744 bytes mysite/main/templates/main/view.html | 20 ++--- mysite/main/urls.py | 2 + mysite/main/views.py | 8 ++ mysite/register/migrations/0001_initial.py | 94 ++++++++++----------- mysite/register/models.py | 2 +- mysite/register/views.py | 5 +- 7 files changed, 69 insertions(+), 62 deletions(-) diff --git a/mysite/db.sqlite3 b/mysite/db.sqlite3 index 3511dfbe38fbc5483889b8b8dc832c8a2eebd149..347fd78cb618fdc7944dd9b56033e474c24f25dc 100644 GIT binary patch delta 2650 zcmc&#OKcNI7~Zj+_!VcJfC&{sY(qjx^I%_g>_oI|9J`5$u^sF<1cbY>H_68Kdc6+MtH=)h5v0bzPboOBN3&S8?k2-g@*jgk1ssK-rtD1xMDCv z`k1H>i!u{4K1`#gj2*XN@ZnS1xB2jb!Yy-BVL%-}Qy50-sl#uuHrIeKt3=%qeJ%3FT&VFPyCf z+%hCy#BJDdS(e{9Tg#4g(!2h5<5Ae9rTRHv8PEKVA)8eALOr5a8aC`wkgmikq@II3 zYXgnDI(my_%K(DtHrVmXIrESnUW0060XWbE{AYy=M9=s*xF*-L%%Dwbx1|gIT3*hK z{be}2m&sAy4RD8}H<=vJe~Z(G|9axSx#Wn!JGT?~YfFx5?|D$IN*BP%>b>*eUafWk zOzUggVen&>n-mf2-@$$7p+-9sr~6_BLLBv2Sz+dk5(J z5rHoTt&YGd{IIipxfiqrubgET1xcj~B$+HOr`K2AxWIY{vFOZ;ggZaV6U7lOP?}ry z`9ejWiOg~dFS+8)M!ad2T1p1jqs+Q87n?jA&&-!3c`?m9@nMf=G~vRt;qXExlow^( zE#>p+iPVzB`8hc#G|qd2r|JAU#dx!f99v_;F~5K(&lTl_=w>2pAaoiZBh;yEd~Hme z$uEZkiTRSe6pIp~&pkD-x}5xi=oV?0N@NLf!YlG;)Z|Q3ZU~BN7^jK?)f8io?*N9~t}fepFz zK4Ws&Y=b5D@mCNOsx2+ zY;qRzJQ||C)7*M;rZ`=4a`8~)N z<)q0*bWaiVDOAp1QOu}!n6=$n946C!o$XIsprdAeZvD>st{Ir_ZxQyJrtTow-ouUq zgcnj=NzP|{WK;Y4h=%snHFXg5S1&T4ue_&f$13GLRlA&0u50<86tsFho7Kb$%KU39 LXqJIjmb8BWvvT!y delta 1088 zcmZvaO>7%g5Xax!565q9ckBko4V4eApuuHx7u_5wZ#`h#L|d5J(7#k48vb+6z6D3IzdgH=;F&)!Wfu zv%i_A|ITdekc|z}Iv6q#LL=<`=SglIpH9{CDPw6CH7;ny`Fd@#1IiC5&Q@rfem$-WT*jG4~qiIJ)_F1 zepJ?vs!CMRGn$f7Xk3$ZT}|e%MC(@Bikj70eOO>@e=nNgm z8LDSw8ds8vK{W^AdXT((CC#YGjGl_8X`0Gz8{ES@L8u(3vTUSP)+WFVdEgF$hj0&m zf^Xn+xWg>H2Xn+DqJA%Cj7Y>MQg|#SUPNKy02)s?roF_`1V5IN+x#wqKj0BOfcx+Z z+-1$bfMJoxSoFA2bfe%zo)>t6Ii4q^vmnSG40!~3R&fGCO&RY)&Eq+5BoG+)k{q@d z&T<1+ljb@tnvGM2{`_Qlnw~5-=BLhI87WoDr_SY;&Dq4vX*FM}B;}RW$(4y}{*^{) zcFM@j%_b6yGtZ7&=TpaeC*e*_Q{!@)Iic&d%9`SatZ6M4&C6D;{%?A4Z^){qD@ICm z{9<^7*paqFt@}W{e1y0SIyZzCAHt({Ulzyk=+;}CTQ|!6p5xrt5lZo9qh2hTm9@%J zbvulYaNU^`_*nkY5L5A{U~6gQ{s>_t2nu3Hn<6x+dCp;|6nN*jww)wtxW zI6h!+UBt2f2kg)VJh(p=9gX$Y$HuzVEWXEaClA`UFLM*3&;J4XxIKu~vDYHweUW4m zZ{}TJtCdEfP=2wvx?~lK<(2Ac!L*j#q;1aQA#qQBwZc7RzcY_V?8D2PZU4E<-LgMh z=8ieOTyI^N!>9R9O9-;f*hR404K3gY;1PICL}?qh{u+Asda(C&uKR)?`ncc0&weD@ a_dSZTUPDgVukiLcf`4%2Z?61#PyP+! {% if user.is_authenticated %} -
-

My list items

-
- {% csrf_token %} - -
-
+

My list items

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

{{l.name}}

-
+
+ +

{{l.name}}

+
+
+ {% csrf_token %} + +
+
{% endfor %}
{% else %} 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..1091394 100644 --- a/mysite/main/views.py +++ b/mysite/main/views.py @@ -58,3 +58,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/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 23aa12b..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, null=True, blank=True) + pass \ No newline at end of file diff --git a/mysite/register/views.py b/mysite/register/views.py index ddea66f..01133c6 100644 --- a/mysite/register/views.py +++ b/mysite/register/views.py @@ -8,10 +8,7 @@ def register(response): if response.method == "POST": form = RegisterForm(response.POST) if form.is_valid(): - user = form.save(commit=False) - default_list = ToDoList.objects.create(name="My todo list") - user.toDoLists = default_list - user.save() + form.save() return redirect("/home") else: form = RegisterForm() From 4ea08e1a97f077903c9fd788ecd52a5ca82da81c Mon Sep 17 00:00:00 2001 From: andy <2768054177@qq.com> Date: Thu, 22 May 2025 00:53:11 +0800 Subject: [PATCH 5/5] Add a delete button: for every todo-list Add a delete button: for each item in todo-list --- mysite/db.sqlite3 | Bin 159744 -> 159744 bytes mysite/main/templates/main/index.html | 82 ++++++++++++++++++-------- mysite/main/views.py | 5 ++ 3 files changed, 63 insertions(+), 24 deletions(-) diff --git a/mysite/db.sqlite3 b/mysite/db.sqlite3 index 347fd78cb618fdc7944dd9b56033e474c24f25dc..da0d47d6ac46063fa77f671bb07973bafd3f48f5 100644 GIT binary patch delta 86 zcmV-c0IC0g;0b`>36L8BR*@V-0ameKBQF67vxF~z5C{Pe^Z*a^59YHBKR delta 75 zcmZp8z}fJCbAmKu;6xc`#=wmU%KD6Kn_Ki71UMK37#R5P@$cQt{{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/views.py b/mysite/main/views.py index 1091394..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})