From 77b4835a476ce9389ea417eaa55320f02a453596 Mon Sep 17 00:00:00 2001 From: zhangyu <1990336738@qq.com> Date: Thu, 20 Nov 2025 21:13:16 +0800 Subject: [PATCH] V1.0 --- .../__pycache__/__init__.cpython-311.pyc | Bin 160 -> 153 bytes .../__pycache__/admin.cpython-311.pyc | Bin 4302 -> 4302 bytes src/accounts/__pycache__/apps.cpython-311.pyc | Bin 474 -> 467 bytes .../__pycache__/forms.cpython-311.pyc | Bin 6705 -> 6698 bytes .../__pycache__/models.cpython-311.pyc | Bin 2521 -> 2514 bytes src/accounts/__pycache__/urls.cpython-311.pyc | Bin 1443 -> 1436 bytes .../user_login_backend.cpython-311.pyc | Bin 1696 -> 1689 bytes .../__pycache__/utils.cpython-311.pyc | Bin 2427 -> 2420 bytes .../__pycache__/views.cpython-311.pyc | Bin 12322 -> 12315 bytes .../__pycache__/0001_initial.cpython-311.pyc | Bin 4128 -> 4121 bytes ...user_created_time_and_more.cpython-311.pyc | Bin 1920 -> 1913 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 171 -> 164 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 173 -> 166 bytes src/blog/__pycache__/__init__.cpython-311.pyc | Bin 156 -> 149 bytes src/blog/__pycache__/admin.cpython-311.pyc | Bin 6354 -> 6347 bytes src/blog/__pycache__/apps.cpython-311.pyc | Bin 462 -> 455 bytes .../context_processors.cpython-311.pyc | Bin 2516 -> 2509 bytes .../__pycache__/documents.cpython-311.pyc | Bin 12118 -> 12111 bytes .../__pycache__/middleware.cpython-311.pyc | Bin 2754 -> 2747 bytes src/blog/__pycache__/models.cpython-311.pyc | Bin 22626 -> 24002 bytes src/blog/__pycache__/urls.cpython-311.pyc | Bin 2543 -> 3584 bytes src/blog/__pycache__/views.cpython-311.pyc | Bin 21365 -> 25821 bytes src/blog/article_views.py | 135 ++ src/blog/forms.py | 61 + src/blog/forms_image.py | 15 + src/blog/image_views.py | 118 ++ .../__pycache__/__init__.cpython-311.pyc | Bin 162 -> 160 bytes .../management/commands/create_categories.py | 41 + .../management/commands/list_categories.py | 13 + src/blog/migrations/0007_articleimage.py | 29 + .../__pycache__/0001_initial.cpython-311.pyc | Bin 8704 -> 8697 bytes ...ngs_global_footer_and_more.cpython-311.pyc | Bin 1036 -> 1029 bytes ...ttings_comment_need_review.cpython-311.pyc | Bin 896 -> 889 bytes ...gs_analytics_code_and_more.cpython-311.pyc | Bin 974 -> 967 bytes ..._category_options_and_more.cpython-311.pyc | Bin 10665 -> 10658 bytes ...alter_blogsettings_options.cpython-311.pyc | Bin 811 -> 804 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 167 -> 160 bytes src/blog/models.py | 16 + .../__pycache__/__init__.cpython-311.pyc | Bin 169 -> 162 bytes .../__pycache__/blog_tags.cpython-311.pyc | Bin 25432 -> 25425 bytes src/blog/urls.py | 27 + src/blog/views.py | 79 + .../__pycache__/__init__.cpython-311.pyc | Bin 160 -> 153 bytes .../__pycache__/admin.cpython-311.pyc | Bin 2876 -> 2869 bytes src/comments/__pycache__/apps.cpython-311.pyc | Bin 474 -> 467 bytes .../__pycache__/forms.cpython-311.pyc | Bin 973 -> 966 bytes .../__pycache__/models.cpython-311.pyc | Bin 2290 -> 2283 bytes src/comments/__pycache__/urls.cpython-311.pyc | Bin 513 -> 506 bytes .../__pycache__/utils.cpython-311.pyc | Bin 2525 -> 2518 bytes .../__pycache__/views.cpython-311.pyc | Bin 3900 -> 3893 bytes .../__pycache__/0001_initial.cpython-311.pyc | Bin 2427 -> 2420 bytes ...02_alter_comment_is_enable.cpython-311.pyc | Bin 843 -> 836 bytes ...ment_created_time_and_more.cpython-311.pyc | Bin 2777 -> 2770 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 171 -> 164 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 173 -> 166 bytes .../__pycache__/comments_tags.cpython-311.pyc | Bin 1512 -> 1505 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 222 -> 215 bytes .../__pycache__/admin_site.cpython-311.pyc | Bin 3229 -> 3222 bytes .../__pycache__/apps.cpython-311.pyc | Bin 957 -> 950 bytes .../__pycache__/blog_signals.cpython-311.pyc | Bin 6335 -> 6328 bytes .../elasticsearch_backend.cpython-311.pyc | Bin 10704 -> 10697 bytes .../__pycache__/feeds.cpython-311.pyc | Bin 3031 -> 3024 bytes .../__pycache__/logentryadmin.cpython-311.pyc | Bin 4637 -> 4630 bytes .../__pycache__/settings.cpython-311.pyc | Bin 11206 -> 11204 bytes .../__pycache__/sitemap.cpython-311.pyc | Bin 3702 -> 3695 bytes .../__pycache__/spider_notify.cpython-311.pyc | Bin 1533 -> 1526 bytes .../__pycache__/urls.cpython-311.pyc | Bin 4207 -> 4200 bytes .../__pycache__/utils.cpython-311.pyc | Bin 13714 -> 13707 bytes .../whoosh_cn_backend.cpython-311.pyc | Bin 38137 -> 38130 bytes .../__pycache__/wsgi.cpython-311.pyc | Bin 691 -> 684 bytes .../__pycache__/base_plugin.cpython-311.pyc | Bin 8167 -> 8160 bytes .../hook_constants.cpython-311.pyc | Bin 795 -> 788 bytes .../__pycache__/hooks.cpython-311.pyc | Bin 2644 -> 2637 bytes .../__pycache__/loader.cpython-311.pyc | Bin 4168 -> 4161 bytes src/locale/zh_Hans/LC_MESSAGES/django.po | 92 + src/logs/djangoblog.log | 1760 ++++++++--------- .../__pycache__/__init__.cpython-311.pyc | Bin 157 -> 150 bytes src/oauth/__pycache__/admin.cpython-311.pyc | Bin 3297 -> 3290 bytes src/oauth/__pycache__/apps.cpython-311.pyc | Bin 465 -> 458 bytes src/oauth/__pycache__/forms.cpython-311.pyc | Bin 1349 -> 1342 bytes src/oauth/__pycache__/models.cpython-311.pyc | Bin 4633 -> 4626 bytes .../__pycache__/oauthmanager.cpython-311.pyc | Bin 24791 -> 24784 bytes src/oauth/__pycache__/urls.cpython-311.pyc | Bin 967 -> 960 bytes src/oauth/__pycache__/views.cpython-311.pyc | Bin 14272 -> 14265 bytes .../__pycache__/0001_initial.cpython-311.pyc | Bin 3505 -> 3498 bytes ...oauthuser_options_and_more.cpython-311.pyc | Bin 3444 -> 3437 bytes ...3_alter_oauthuser_nickname.cpython-311.pyc | Bin 889 -> 882 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 168 -> 161 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 170 -> 163 bytes .../__pycache__/oauth_tags.cpython-311.pyc | Bin 1427 -> 1420 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 161 -> 154 bytes .../__pycache__/admin.cpython-311.pyc | Bin 479 -> 472 bytes .../__pycache__/apps.cpython-311.pyc | Bin 477 -> 470 bytes .../__pycache__/models.cpython-311.pyc | Bin 1422 -> 1415 bytes .../__pycache__/urls.cpython-311.pyc | Bin 739 -> 732 bytes .../__pycache__/views.cpython-311.pyc | Bin 7765 -> 7758 bytes .../__pycache__/0001_initial.cpython-311.pyc | Bin 1489 -> 1482 bytes ...ntracklog_options_and_more.cpython-311.pyc | Bin 967 -> 960 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 172 -> 165 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 159 -> 152 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 177 -> 170 bytes .../__pycache__/plugin.cpython-311.pyc | Bin 1944 -> 1937 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 182 -> 175 bytes .../__pycache__/plugin.cpython-311.pyc | Bin 9911 -> 9904 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 174 -> 167 bytes .../__pycache__/plugin.cpython-311.pyc | Bin 2759 -> 2752 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 178 -> 171 bytes .../__pycache__/plugin.cpython-311.pyc | Bin 7285 -> 7278 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 172 -> 165 bytes .../__pycache__/plugin.cpython-311.pyc | Bin 2288 -> 2281 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 173 -> 166 bytes .../__pycache__/plugin.cpython-311.pyc | Bin 7987 -> 7980 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 170 -> 163 bytes .../__pycache__/plugin.cpython-311.pyc | Bin 1292 -> 1285 bytes .../MemcacheStorage.cpython-311.pyc | Bin 2456 -> 2449 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 165 -> 158 bytes .../__pycache__/admin.cpython-311.pyc | Bin 1052 -> 1045 bytes .../__pycache__/apps.cpython-311.pyc | Bin 489 -> 482 bytes .../__pycache__/models.cpython-311.pyc | Bin 2523 -> 2516 bytes .../__pycache__/robot.cpython-311.pyc | Bin 10686 -> 10679 bytes .../__pycache__/urls.cpython-311.pyc | Bin 462 -> 455 bytes .../api/__pycache__/__init__.cpython-311.pyc | Bin 169 -> 162 bytes .../api/__pycache__/blogapi.cpython-311.pyc | Bin 2136 -> 2129 bytes .../api/__pycache__/commonapi.cpython-311.pyc | Bin 3913 -> 3906 bytes .../__pycache__/0001_initial.cpython-311.pyc | Bin 2167 -> 2160 bytes ...ilsendlog_options_and_more.cpython-311.pyc | Bin 1163 -> 1156 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 176 -> 169 bytes src/templates/blog/article_create.html | 284 +++ src/templates/blog/article_edit.html | 341 ++++ src/templates/blog/image_upload.html | 49 + src/templates/blog/my_articles.html | 66 + .../blog/tags/article_meta_info.html | 2 + src/templates/blog/tags/sidebar.html | 2 + src/templates/share_layout/nav.html | 1 + 134 files changed, 2192 insertions(+), 939 deletions(-) create mode 100644 src/blog/article_views.py create mode 100644 src/blog/forms_image.py create mode 100644 src/blog/image_views.py create mode 100644 src/blog/management/commands/create_categories.py create mode 100644 src/blog/management/commands/list_categories.py create mode 100644 src/blog/migrations/0007_articleimage.py create mode 100644 src/templates/blog/article_create.html create mode 100644 src/templates/blog/article_edit.html create mode 100644 src/templates/blog/image_upload.html create mode 100644 src/templates/blog/my_articles.html diff --git a/src/accounts/__pycache__/__init__.cpython-311.pyc b/src/accounts/__pycache__/__init__.cpython-311.pyc index fde4d05c2619d3c266c0330afdb43570c1f7eb3c..e5596324500dd5a65a25a90ee2580f48ae49b9d6 100644 GIT binary patch delta 48 zcmZ3$IFpfQIWI340}u$+a%4{AF_F-5v5G0lFHKL4amh-|OV4-8$xn|dE=ryl?+5@R CISwuW delta 55 zcmbQqxPXyoIWI340}w3T{~}`|kBPjovsH{sR$^XyzEe(qdQ47!a$*jWz{Chg0MY9b AUH||9 diff --git a/src/accounts/__pycache__/admin.cpython-311.pyc b/src/accounts/__pycache__/admin.cpython-311.pyc index 796783ea83e1a47d7432f487cf9250232fab5f0e..4c38d84ba2bdf2bf9aa7dd2bcd91da679a301ff4 100644 GIT binary patch delta 21 bcmX@7cutXLIWI340}$-tkk8!6b4UOHKfMK! delta 21 bcmX@7cutXLIWI340}wFpd7ZJ5=a2vZL!<^* diff --git a/src/accounts/__pycache__/apps.cpython-311.pyc b/src/accounts/__pycache__/apps.cpython-311.pyc index a59634c599205435f18d9d5c8694f552be71da19..a477dba21981f22c93aae32c3c8a4bc4d69503fb 100644 GIT binary patch delta 50 zcmcb`e3_YdIWI340}u$+a%3h<)I;bIk2l3$vh8sn0cn3taKl#`zxQ(TlhnS=2X E0BW!g=>Px# delta 57 zcmcc2e2bZPIWI340}w3T{~{xLBJUk}eP^o}m#oCR^n9nB{PdWd{N%(OB!S6{jF$i? C{}dDe diff --git a/src/accounts/__pycache__/forms.cpython-311.pyc b/src/accounts/__pycache__/forms.cpython-311.pyc index 22b4e8e82918306e65c23f2d5e27e3fc8ca8491c..6acaba6b7b44007979c0c8f561524a8ba9f230b6 100644 GIT binary patch delta 53 zcmdmJvdV;SIWI340}u$+a%3j*Z{*v=ETQRQ6;qO5nw}ctl9ia3p6`^CpB__Ol)U*q HbC4JSi{22F delta 60 zcmZ2wveATZIWI340}w3T|03fJ-$uSo%<=}#RxvJFiFxVyPC5DMF**6ki8)9Dn{O}& Gi2(p=fE7*v diff --git a/src/accounts/__pycache__/models.cpython-311.pyc b/src/accounts/__pycache__/models.cpython-311.pyc index 20b237eeb6a1fcae92d1a6f10f7a1131dcb7513e..934607086936be5a145edba3359e69cf0ffe5ba2 100644 GIT binary patch delta 52 zcmca9d`XyhIWI340}u$+a%3Lf$ScY$q2*!~Q<7hro*Ltlm6(^F@063D9#dSDyxEa? G1{(l?br0_V delta 59 zcmca4d{dZrIWI340}w3T{~}|-MqW{7c|&Kb7?-TXy!3phoc#2doc!d(93+9wR?IWl E06xnT`~Uy| diff --git a/src/accounts/__pycache__/urls.cpython-311.pyc b/src/accounts/__pycache__/urls.cpython-311.pyc index 66af0910924c361fc09f2ebbbf8e25ef74345e9a..99e52e73c73787459a2659ad656697f70ad5d99d 100644 GIT binary patch delta 52 zcmZ3?J%^ijIWI340}u$+a%B2% F0st`R6qW!0 diff --git a/src/accounts/__pycache__/user_login_backend.cpython-311.pyc b/src/accounts/__pycache__/user_login_backend.cpython-311.pyc index 798bfd8675b5540b26791aade398024e8c9656f6..60a3fb20bc651899b8774dd47aac3e5fefe6d969 100644 GIT binary patch delta 52 zcmZ3$JCm1pIWI340}u$+a%4JfIWI340}w3T{~|+UBX2R2ysfiUj7wHxUV6S$PJVh!PJVJ?4wAs;8BB~U E03N&(GXMYp diff --git a/src/accounts/__pycache__/utils.cpython-311.pyc b/src/accounts/__pycache__/utils.cpython-311.pyc index 9fb3583746e2f81985ff02baea92ac477cda34b4..ac69269c3d487898d1c0f7ea4790b627ce402fcd 100644 GIT binary patch delta 52 zcmew@^hJnwIWI340}u$+a%6UH`yw7?-TXy!3phoc#2doc!d(93+9wmsvfu E07`5WqyPW_ diff --git a/src/accounts/migrations/__pycache__/0001_initial.cpython-311.pyc b/src/accounts/migrations/__pycache__/0001_initial.cpython-311.pyc index 6c26aa57d4820c0e22781db6eef67279c2c3c5e5..8f8a7f6b8d2310629e63fa561cb588606c773779 100644 GIT binary patch delta 52 zcmZ3WFjIkdIWI340}u$+a%6^XxQvl!IWI340}u$+a%4{AF_Exzv5G0lFHKL4amh-|OV4-8$xn|dE=ryl?*{-W CYYt)n delta 55 zcmZ3+xR#M;IWI340}w3T{~}`|kBPj4vsH{sR$^XyzEe(qdQ47!a$*jWz{ChY0NE}Q Ak^lez diff --git a/src/blog/__pycache__/__init__.cpython-311.pyc b/src/blog/__pycache__/__init__.cpython-311.pyc index 7427588e353224b88d44108a737277f45e976843..dd680d9ae689bbf49c262b7249f3845361996ba8 100644 GIT binary patch delta 48 zcmbQkIF*rSIWI340}u$+a%4{AF_F-4v5G0lFHKL4amh-|OV4-8$xn|dE=rylZwmk+ CQ4Sse delta 55 zcmbQrIERsEIWI340}w3T{~}`|kBPj#vsH{sR$^XyzEe(qdQ47!a$*jWz{Ch!0MD-y AP5=M^ diff --git a/src/blog/__pycache__/admin.cpython-311.pyc b/src/blog/__pycache__/admin.cpython-311.pyc index 118e2b04250205e2ea55d5a4d3c0f748e520bd8d..673d62bea59525101d01802205670438a21f5cb6 100644 GIT binary patch delta 52 zcmca)c-oM6IWI340}$-tkk5Ruk#_;JgsO{GOi6xedTNYIR$^XyzEe(qdQ5Rq^5!$l GY@z_G8xa%$ delta 59 zcmX?Yc*&4=IWI340}w3T{~{xABkuxcc^zk~7?-TXy!3phoc#2doc!d(93+9wN153~ E0ajNOh5!Hn diff --git a/src/blog/__pycache__/apps.cpython-311.pyc b/src/blog/__pycache__/apps.cpython-311.pyc index 4f47c024095d6702f9cd6fa6957ff58d5ce505c1..dce26602614e5ec709421d2f02cdf3825d7deca6 100644 GIT binary patch delta 49 zcmX@de4LqgIWI340}u$+a%4tK%H;$jt3l3$vh8sn0cn3taKl#`zxQ(TlhiSZl& DRId-P delta 56 zcmX@ke2$rSIWI340}w3T{~{xJBJUM>ZD*?(m#oCR^n9nB{PdWd{N%(OB!P)P&jA1r CniSap diff --git a/src/blog/__pycache__/context_processors.cpython-311.pyc b/src/blog/__pycache__/context_processors.cpython-311.pyc index 520645d7270ddf60a7e562a123a0385cfd813bc2..caf22b6a5f36bda907e1bf516dc4375f43c413d7 100644 GIT binary patch delta 52 zcmca2d{&ruIWI340}u$+a%6UIJQ<7hro*Ltlm6(^F@063D9#dSDy!kR4 GBQpStbPz=V delta 59 zcmX>rd_|adIWI340}w3T{~{w{BkyuHc}r)j7?-TXy!3phoc#2doc!d(93+9wXV@5- E0ZR82N&o-= diff --git a/src/blog/__pycache__/documents.cpython-311.pyc b/src/blog/__pycache__/documents.cpython-311.pyc index 428ead874325a3dedebe0686c6f236cc6d48bf51..a587d32c7c94386a9310359fc1dff8640be2b4d7 100644 GIT binary patch delta 52 zcmcZ>cRr4HIWI340}u$+a%4W($lJ~;q3L23Q<7hro*Ltlm6(^F@063D9#dSDym>S0 GVodfcP);0IWI340}w3T|008XBX2vayn(Y-j7wHxUV6S$PJVh!PJVJ?4wAs;HLQy@ E0a@@B3;+NC diff --git a/src/blog/__pycache__/middleware.cpython-311.pyc b/src/blog/__pycache__/middleware.cpython-311.pyc index 07d696b523f1ffaa24f00f9764ebf2f28bfd376b..0079e49ea0f27e481a11b112630c15c59f54a55e 100644 GIT binary patch delta 52 zcmX>kx?7ZYIWI340}u$+a%8^T$oqp)Ld(S}rX;^KJvGK9D={xU-zg_QJ*K!Qd9w=B GJPrVu{t&hR delta 59 zcmdljdPtOaIWI340}w3T{~}}mM&2Kc@`lbuxxGnj(%GyZNoJciS#8U-3tGjGwN^(=n>agc>AYNe?y|(BaW@G< zkR=1fj=}6WVmmTt=0h!*hmOb?%ADJiFJm`w*+O0hgVxC&Rzdb4gYAD3jHUgbdw%zx z|HtqCKh7Vk=%@S0eA{GV8IbQ-XJlf}=Vm+l=bPSN5UXO2Gr02-gB|2E)UNNr=pDxE zEd7fVWbYXro=GLrVR2?OD$IowZ^aVfnWQvZ`dghnN(x7eNJkQ0=Lu0KYNC3|P6exq z>SZ;<+<{$}X@iOZ595n7oLH<`M&JXxE?8UCk?#+@_8yD%TPy}_EV5e|O*KaIi|86- z)0Q}6ky}>5KVa8o+CtiWuV!~(%Oz&I8Sj8fo2%SWDHWNGiEqb+u$Z=j=lb<4kM9)L z@(&(=a%Fwx>$R^wt?DAwn)Iq92^^}NB*ui4i1|4oE~a&$s(WYbLY<7S`wzOO2Ho*N zHy-q&sxf^&mJl#M1})_pA?sJK{`te|lm9?*8t6rMOCJE#UFP#^_wTJQe*0wcE--LH zI+ft(5*K&@V>001Nn(9wa?0OvB#fqYSPk`Po;PoQ)G zl0v^RyAL83nTt#m-gSvK=9_0Q0!w2S(Z=n_GdF1Fs_~54)$j6Zq%6crdjYE2S{tPy zsyGFZq;xK+hn_D2WLh>CyKjK!lPQVk57YFWV9zlX>&|Pt6>GO_8HQ)2rPx+<*1u)L zu;d1xaj%v9IMR0F0VVZOcu0XJQDtkFVk{!Yu;idx7MP`b)YOE<OCc%l%eiZi7RLWr9)JaW;tm&wjo%8Q2W@kaa>brYL4xW+CQ)Tm%VxGz!uW+67 zV+z-~BrFL9!x!hiJSV?7A#=ep7gV@l?pVdTYoSN6?kcukAeNa-4SXnQm&TSH}Q zNU?@uIe*30yWmr7y(3TeE<%?{|3nJCQo1#979l%9 zAqQ)rEut_|@`l1{9sTt7lIy2`Mr{O7Vo%MXn|7U!sW$ZIhJ*10PRGPU61}4EFv)!B dugM|RZWDqex5I+(+QFw(|LmpFMVx0w{s*g`XjT9K delta 190 zcmX@KoAJ>GM!w~|yj%=Guyp^6j5xiCd=iWoHmaXzWJ_TTX3&(~ti*JMQC`>CD#j%% zF)uyeDJMTYCMQ2RF$YOtGapO6^M#j>~F(D<4?3*u!#4$2*O*ROV<6;DAC;}12n6vr3v!Wec9{)sWaY=bd41)3_Vs>rgG#+OJ@RH;p+B1>q)Zt*(H4=wAY zaLO@<-h1sSRn`6@JybGiC02W~)KhL)@hPXiH?vDkvx&^I%)WX1neUq)Zw7u7#V`lg z-{Gtp2J0WJxL4dU-hIh)+%KHW$v%y1`D#8N+J4R73e*B%2jm59p~csDYV%+RYe8xU z!4B0zV25hN&nZ5cDE!%?8{k(O+pW3JH(>nXRycX_&+wZ7c;L$}suP)8NAT1UK_}uW z->N@Lo;pz_cqYuH6Z6zr1|4xOofS`=RT$Tjt0S*@GV8!ZUFKF}-|*Cl&#klRsgnSm z*j)YD^3+Mrt&{T9NrTSvT>Z&->SX8E+4j`g@pF*-0eSb05B39m*#+t=u6>(ToNX=V zJY(fSb#)$9dCya)06J@~j$H6$_JLWSGW(uPQ3;)GxXf)vDVIET4nW5}*Eso(C-WIF zn{&k~|6ixMT1&{4Z@E(SEee%<_Ci-OPT?7DNR3ma-j$llTU6We*Hd(haqt zDRtKoQCq;Vs=e?`>ojf7=GC^W{DhKisih2JC{;aF+s1vgj;eN;0yMxj1tSGA^LVs=>mz z1PE4b!L8x@fzaxg9Y?QfM_T>5TN~^)K)>11`_;pqcHX@2R_i!or)SZrlXY=Wb{(FL zZp;uH*_w;jS$j5L3F+K8?da7*_PiNTbX-ojychXFl$DuAEXJlGHJv_!bu&a5>yCcT zgZe-|`d{QNmt*7JP06Xn?=su~)N~5DoMn~^e=;qQFfYI^4g&xErgav^DW}@4r z^KCCa!cFu&Y&<(8_2>?>mmje0cT7{BzH?m(PNcCD z%zI2{l8QuN(%|GV6usU1oqGoi_db7o|HSB=HzHRVXZ2aWKk>iq?iKMDAJK8s6T%-$Av?_&18|jX#Gj*Mk{yxkknEUb#}d~jp#Z;e#X)h6#e{JDBEm@zIDv2y;UvPzDf|dv zlVrzae?<0&q-2tkC4Q9NvdFqg_Q#|;BGn9&q_?N^S6*}u={=#xJF!zti67iHwIv*opYL zMOICc8k1&mmjMl9S)?+5=kzNr6I1V8#0u%-V6 DYKmj) delta 768 zcmZpWc`vN7oR^o20SK1vf05C|#=!6x#DM`pDC6@s=7}1b;;d0@Obn@vDQu~%S?n-1 z3pge=3Qv}25>RDd!?BE+fnhZeLjYJYCsxJGTx&QcE>mQLX=dgD^52PbgWUqsjWCuE ztFin*W3ea}z^YgfsF)k-C?u1GuqqbDu2=-CVo{)C9(0q1l(7YbI5wpM))H9Fm1JT7 zh8}Z@)G|h3hypPL0FB^5S(5Oby&1SfmD2006`n Bi2eWo diff --git a/src/blog/__pycache__/views.cpython-311.pyc b/src/blog/__pycache__/views.cpython-311.pyc index 53309ba9e79fe0ffc07bc40bddf6dbc84fc880dd..2a42aa6c48b3b118e13165b2df2366c8820c2ff8 100644 GIT binary patch delta 4934 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 delta 59 zcmey#*1*oYoR^o20SK1vf01!!BQH0Te7Lh!j7wHxUV6S$PJVh!PJVJ?4wArT113*K E062RSnE(I) diff --git a/src/blog/migrations/__pycache__/0004_rename_analyticscode_blogsettings_analytics_code_and_more.cpython-311.pyc b/src/blog/migrations/__pycache__/0004_rename_analyticscode_blogsettings_analytics_code_and_more.cpython-311.pyc index 04ad362064eed219c08f7d95a87c41b01807ea90..872d0897ea5ff3f12a8bb3bcabf1070ad0e1c6c5 100644 GIT binary patch delta 52 zcmX@dew>|mIWI340}u$+a%5iI$ScJpk?CR;Q<7hro*Ltlm6(^F@063D9#dSDyxEPZ GgAo9L-4Fo) delta 59 zcmX@kevX}YIWI340}w3T{~}}CMqVi<`2uIF7?-TXy!3phoc#2doc!d(93+9w_Dmg& E06};Z761SM diff --git a/src/blog/migrations/__pycache__/0005_alter_article_options_alter_category_options_and_more.cpython-311.pyc b/src/blog/migrations/__pycache__/0005_alter_article_options_alter_category_options_and_more.cpython-311.pyc index a8d8413aacb75bc364e44900374e85c124375758..6333d15ec9608e7cf774096aba1b2517d12b13c2 100644 GIT binary patch delta 53 zcmZ1(yeOD&IWI340}u$+a%8gTZ{*98lt^{4iYdu2O;3$+$x6&i&v(knPmd`sO5QwO HQb+&*i&hX9 delta 60 zcmZ1!yfT///.html', views.ArticleDetailView.as_view(), name='detailbyid'), + path( + r'article/create/', + article_views.ArticleCreateView.as_view(), + name='article_create'), + path( + r'article/edit//', + article_views.ArticleUpdateView.as_view(), + name='article_edit'), + path( + r'my-articles/', + views.my_articles, + name='my_articles'), path( r'category/.html', views.CategoryDetailView.as_view(), @@ -59,4 +73,17 @@ urlpatterns = [ r'clean', views.clean_cache_view, name='clean'), + # 图片相关路由 + path( + 'article//upload-image/', + image_views.ImageUploadView.as_view(), + name='upload_image'), + path( + 'markdown-image-upload/', + image_views.markdown_image_upload, + name='markdown_image_upload'), + path( + 'image//delete/', + image_views.ImageDeleteView.as_view(), + name='delete_image'), ] diff --git a/src/blog/views.py b/src/blog/views.py index 773bb75..cab73f6 100644 --- a/src/blog/views.py +++ b/src/blog/views.py @@ -378,3 +378,82 @@ def permission_denied_view( def clean_cache_view(request): cache.clear() return HttpResponse('ok') + + +from django.contrib.auth.decorators import login_required +from django.contrib.auth.mixins import LoginRequiredMixin +from django.shortcuts import redirect +from django.views.generic.edit import CreateView, UpdateView +from django.urls import reverse_lazy +from .forms import ArticleForm + + +class ArticleCreateView(LoginRequiredMixin, CreateView): + """创建文章视图""" + model = Article + form_class = ArticleForm + template_name = 'blog/article_create.html' + + def form_valid(self, form): + form.instance.author = self.request.user + + # 处理分类 + category_name = form.cleaned_data['category'] + category, created = Category.objects.get_or_create( + name=category_name, + defaults={'parent_category': None} + ) + form.instance.category = category + + # 处理标签 + tags_str = form.cleaned_data['tags'] + if tags_str: + tag_names = [tag.strip() for tag in tags_str.split(',') if tag.strip()] + form.instance.save() # 保存文章实例,以便可以添加多对多关系 + for tag_name in tag_names: + tag, created = Tag.objects.get_or_create(name=tag_name) + form.instance.tags.add(tag) + + return super().form_valid(form) + + def get_success_url(self): + return reverse_lazy('blog:detailbyid', kwargs={ + 'article_id': self.object.id, + 'year': self.object.creation_time.year, + 'month': self.object.creation_time.month, + 'day': self.object.creation_time.day + }) + + +class ArticleUpdateView(LoginRequiredMixin, UpdateView): + """更新文章视图""" + model = Article + form_class = ArticleForm + template_name = 'blog/article_edit.html' + pk_url_kwarg = 'article_id' + + def dispatch(self, request, *args, **kwargs): + obj = self.get_object() + # 只有文章作者或管理员可以编辑 + if obj.author != request.user and not request.user.is_superuser: + return redirect('blog:detailbyid', + article_id=obj.id, + year=obj.creation_time.year, + month=obj.creation_time.month, + day=obj.creation_time.day) + return super().dispatch(request, *args, **kwargs) + + def get_success_url(self): + return reverse_lazy('blog:detailbyid', kwargs={ + 'article_id': self.object.id, + 'year': self.object.creation_time.year, + 'month': self.object.creation_time.month, + 'day': self.object.creation_time.day + }) + + +@login_required +def my_articles(request): + """显示当前用户的文章列表""" + articles = Article.objects.filter(author=request.user) + return render(request, 'blog/my_articles.html', {'articles': articles}) diff --git a/src/comments/__pycache__/__init__.cpython-311.pyc b/src/comments/__pycache__/__init__.cpython-311.pyc index 728d159015a945c3f6a225603e6b734a071f6d32..bf56a9a55611367b9418b42291c49ed84777b15a 100644 GIT binary patch delta 48 zcmZ3$IFpfQIWI340}u$+a%4{AF_F-5v5G0lFHKL4amh-|OV4-8$xn|dE=ryl?+5@R CISwuW delta 55 zcmbQqxPXyoIWI340}w3T{~}`|kBPjovsH{sR$^XyzEe(qdQ47!a$*jWz{Chg0MY9b AUH||9 diff --git a/src/comments/__pycache__/admin.cpython-311.pyc b/src/comments/__pycache__/admin.cpython-311.pyc index ab8ac24d44e8f2361ac96a165532bf654a14cf62..2f1f1cd6684352a94a23d5f011d4e82fd86382a0 100644 GIT binary patch delta 52 zcmdlZwpEOGIWI340}$-tkk34|k#_>4gr)I;bIk2l3$vh8sn0cn3taKl#`zxQ(TlhnS=2X E0BW!g=>Px# delta 57 zcmcc2e2bZPIWI340}w3T{~{xLBJUk}eP^o}m#oCR^n9nB{PdWd{N%(OB!S6{jF$i? C{}dDe diff --git a/src/comments/__pycache__/forms.cpython-311.pyc b/src/comments/__pycache__/forms.cpython-311.pyc index 76e09d517a4656699f8eda5cf28a722dff927bf7..683aa6f9ddb1d76e4ef3d3b3034ffd6a33c50005 100644 GIT binary patch delta 52 zcmX@hevF-WIWI340}u$+a%8G+`yw7?-TXy!3phoc#2doc!d(93+9wHyGbB F0suI|6wUwu diff --git a/src/comments/__pycache__/models.cpython-311.pyc b/src/comments/__pycache__/models.cpython-311.pyc index ae6d0645a0ddf96331aa54d5796890e3dc801b48..b0a36ebdd86e7997cb9c37eb46f02a0c9dde0184 100644 GIT binary patch delta 52 zcmew)_*#&6IWI340}u$+a%A4w$m_u(q2*!~Q<7hro*Ltlm6(^F@063D9#dSDyt#y> Gjs*aeCJ=%E delta 59 zcmaDY_(_m=IWI340}w3T{~}}SMqUpVc|&Kb7?-TXy!3phoc#2doc!d(93+9wxh!=o E097#*ivR!s diff --git a/src/comments/__pycache__/urls.cpython-311.pyc b/src/comments/__pycache__/urls.cpython-311.pyc index 1989e5ad55e46fb27fa36986b3f1b6da6a574bc8..680c8230e5c9e23c41cf24b49d1f0dab26a15d5f 100644 GIT binary patch delta 51 zcmZo<`Nhn;oR^o20SJU@IWnJZxvIWI340}w3T|03i3MqW{Nc>`yw7?-TXy!3phoc#2doc!d(93+9wR_t?_ E07%soIsgCw diff --git a/src/comments/__pycache__/views.cpython-311.pyc b/src/comments/__pycache__/views.cpython-311.pyc index 3b9cd589573473bdee1fdef810a6796d85ef373c..41da3162d49e92d11e14b0cf40b6f30a914a87f9 100644 GIT binary patch delta 53 zcmdlZw^fdBIWI340}u$+a%75dZsc3RB%$eI6;qO5nw}ctl9ia3p6`^CpB__Ol)U*W HQ#ua-dV&xj delta 60 zcmdlgw?~d|IWI340}w3T|03fm$40&tO!5ZKRxvJFiFxVyPC5DMF**6ki8)9Do6j+& G^8f%}3Kb9l diff --git a/src/comments/migrations/__pycache__/0001_initial.cpython-311.pyc b/src/comments/migrations/__pycache__/0001_initial.cpython-311.pyc index 2679ff53737f1e8f86c958e8bc84ba77cbea32bb..e2eed5a039321274205078fa5f8187f341b280a9 100644 GIT binary patch delta 52 zcmew@^hJnwIWI340}u$+a%7&}$g9sLVeMiSQ<7hro*Ltlm6(^F@063D9#dSDyg8ap Gff)dl0}u-U delta 59 zcmew&^jnB`IWI340}w3T{~}}gMqYh3c_(M97?-TXy!3phoc#2doc!d(93+9wA#4iF E097#*6#xJL diff --git a/src/comments/migrations/__pycache__/0002_alter_comment_is_enable.cpython-311.pyc b/src/comments/migrations/__pycache__/0002_alter_comment_is_enable.cpython-311.pyc index 7ff08950ee0dc5be1b89f1022a063b73b879a8ea..f3d16b3c853021d67883daf2e1fcf6cadaf44f26 100644 GIT binary patch delta 52 zcmX@jc7%<0IWI340}u$+a%8UC$a{-X!rR3vrX;^KJvGK9D={xU-zg_QJ*K!Qc{3Z6 GDfF delta 60 zcmca4dQ+5dIWI340}w3T|03fe$40(aZ1SbfRxvJFiFxVyPC5DMF**6ki8)9Dn+4bp GF#`a3#uZoq diff --git a/src/comments/migrations/__pycache__/__init__.cpython-311.pyc b/src/comments/migrations/__pycache__/__init__.cpython-311.pyc index 4902e1634e528d8a6b63a8ff0333232071ec9568..1bf0fe242dac777d5a382ea45cb028c64f782728 100644 GIT binary patch delta 48 zcmZ3@xP*~sIWI340}u$+a%4{AF_AELv5G0lFHKL4amh-|OV4-8$xn|dE=ryl?*jlR CcMe(r delta 55 zcmZ3&xSEk?IWI340}w3T{~}`|kBPjUvsH{sR$^XyzEe(qdQ47!a$*jWz{Ch20N4-` AiU0rr diff --git a/src/comments/templatetags/__pycache__/__init__.cpython-311.pyc b/src/comments/templatetags/__pycache__/__init__.cpython-311.pyc index 3fb7b3c5bfe562f0060c887a8729658b8b18b120..de4a888dcf8ed829c3771369c17712867d681d72 100644 GIT binary patch delta 48 zcmZ3>xQvl!IWI340}u$+a%4{AF_Exzv5G0lFHKL4amh-|OV4-8$xn|dE=ryl?*{-W CYYt)n delta 55 zcmZ3+xR#M;IWI340}w3T{~}`|kBPj4vsH{sR$^XyzEe(qdQ47!a$*jWz{ChY0NE}Q Ak^lez diff --git a/src/comments/templatetags/__pycache__/comments_tags.cpython-311.pyc b/src/comments/templatetags/__pycache__/comments_tags.cpython-311.pyc index d2f2e9463d52f53fb7e7e8a2bcc5c71fcb4f38bd..e44628d8d01861e95fa77fa1f2f1a8e1bf40ead5 100644 GIT binary patch delta 52 zcmaFC{g9h?IWI340}u$+a%8^P$UB8e!p_AirX;^KJvGK9D={xU-zg_QJ*K!QdGi4# G4Q2qFc@Vz< delta 59 zcmaFJ{eqi!IWI340}w3T|03hmM&2n*@~+NSF)mq&dFlC1Ir-@^Ir+(nIYZd?A=`IWI340}w3T|01JLY$M-dW_c%Ps~DH8#Ju!;r=0xsn4J9N#2h4n#V487 E0Ah<3761SM diff --git a/src/djangoblog/__pycache__/feeds.cpython-311.pyc b/src/djangoblog/__pycache__/feeds.cpython-311.pyc index 045476a1e6238b115473dea9f63d623cf165eef2..5aede73c8f4eb786be98b30c48bd5794b1c40cb8 100644 GIT binary patch delta 52 zcmcaEenFgfIWI340}u$+a%4{5$Q!~Wq3vQ7Q<7hro*Ltlm6(^F@063D9#dSDyt#oX GoD%?pjSvO^ delta 59 zcmca0eqEe*IWI340}w3T{~{xQBX0b4PF)mq&dFlC1Ir-@^Ir+(nIYWek7c4IWI340}$-tkk8z&zmZRiTSCvpDyAgAG(9!OB`Yy6J>MxOKRu?nD0y=b HcZmW3uh9_y delta 55 zcmX>Sek`1CIWI340}!k{_&P&ZZzG=;x0HdiRZM7cYEf~Fp{1pPag0k=VqSW_Q%-*R J<^b*z1pwp35sCl+ diff --git a/src/djangoblog/__pycache__/sitemap.cpython-311.pyc b/src/djangoblog/__pycache__/sitemap.cpython-311.pyc index 527cd15930d9b4ce8bc53bb2df8a49f060810655..420f8ac72868ddfb87c8fa31b700aac0f1c6670e 100644 GIT binary patch delta 52 zcmew+^InE`IWI340}wb4PF)mq&dFlC1Ir-@^Ir+(nIYLqf~NDyAgAG(9!OB`Yy6J>MxOKRu?nD0%Zw Hjxu%tp=1#+ delta 60 zcmaE%@Lqv$IWI340}w3T{~}{A_eQ=m9P)$~mDHX&3 diff --git a/src/djangoblog/__pycache__/utils.cpython-311.pyc b/src/djangoblog/__pycache__/utils.cpython-311.pyc index 5da0bed4094b28148ff17ed3970185ec52536925..c6edec4e75213f2a8f3879a770c4f9e8eabea29c 100644 GIT binary patch delta 53 zcmbP~-JQ+1oR^o20SNYR$Y*jYZsdE$B%$qM6;qO5nw}ctl9ia3p6`^CpB__Ol)PD( Hx!wo>n@$jX delta 60 zcmeCqo|MhEoR^o20SK1vf06N1ek0#ACV3-gs~DH8#Ju!;r=0xsn4J9N#2h4n%{raz%u9IWI340}w3T{~}}2M&93y@(#{cF)mq&dFlC1Ir-@^Ir+(nIY@L>S7gBl3$vh8sn0cn3taKl#`zxQ(TlhnThc{ E0A*VbzW@LL delta 56 zcmX@be36-VIWI340}w3T{~{xFBJVYM9cQZ;m#oCR^n9nB{PdWd{N%(OB!P*)&jSDv Cp%mu; diff --git a/src/oauth/__pycache__/forms.cpython-311.pyc b/src/oauth/__pycache__/forms.cpython-311.pyc index 2765c9aea203ee008049187ab5ab4359487b54c1..4f52ff42650c6d395d6d6f5e8f5312186b24b3cf 100644 GIT binary patch delta 52 zcmX@gwU3K;IWI340}u$+a%6tp$UBosLe0f0rX;^KJvGK9D={xU-zg_QJ*K!QdGk@G G1||TFl@QGU delta 59 zcmdnTb(D*DIWI340}w3T|03h%M&6lB^19AeF)mq&dFlC1Ir-@^Ir+(nIYdFj7wHxUV6S$PJVh!PJVJ?4wAs;P?o*C E04UxQ-~a#s diff --git a/src/oauth/__pycache__/oauthmanager.cpython-311.pyc b/src/oauth/__pycache__/oauthmanager.cpython-311.pyc index e1224714d66b5fcf27604189e39d395de8435336..bc58e28d7ea41087911cedf653c7faec25968641 100644 GIT binary patch delta 62 zcmcb9knzGnM!w~|yj%=GAXLkdS?IWtZ!wdEu8UPnNq%X1YK%)(VqSW_Q%-(*OmR{2 R<_k=V_!)0)E*47h0|0G76)*q* delta 69 zcmca`kn#FKM!w~|yj%=Guyp^6j7s~Be2banO`NS_T(T1L((|2i^3!8-@{<#DkOVfL PWLm_}_-k{HP>LS_Um+QP diff --git a/src/oauth/__pycache__/urls.cpython-311.pyc b/src/oauth/__pycache__/urls.cpython-311.pyc index 93f5f7b4901b359ed03bd034c7db2eae3fbf0951..43e6c9457d1eb9bcade8eb3e230530a438ed20f7 100644 GIT binary patch delta 52 zcmX@ket?~KIWI340}u$+a%9$S|mIWI340}w3T{~{x0BX19rypFR~j7wHxUV6S$PJVh!PJVJ?4wAs;jZFNE E06BaU-2eap diff --git a/src/oauth/__pycache__/views.cpython-311.pyc b/src/oauth/__pycache__/views.cpython-311.pyc index 1503f3c94b5c22a2fc38366d70092d0065ea6e90..de55f3a3660c3e5d68fe713fb59b6007a04b691b 100644 GIT binary patch delta 53 zcmX?*zcZh2IWI340}u$+a%5(zZsg-(l~8lBiYdu2O;3$+$x6&i&v(knPmd`sO5SYA H+HM2@mbDN} delta 60 zcmdm)e;}W4IWI340}w3T{~{wtWg{OCtGuqWRg6nkVqSW_Q%-(*Oiq4sVh)nPW+T>i FBLH5^6n+2z diff --git a/src/oauth/migrations/__pycache__/0001_initial.cpython-311.pyc b/src/oauth/migrations/__pycache__/0001_initial.cpython-311.pyc index 13fca2f62890cd66b46759ad237f2bfebac639f7..6910b6c43b2b2597e8b428ded7ccc839c4bf4002 100644 GIT binary patch delta 52 zcmdley-J#QIWI340}u$+a%A4$$orQ=!otNWrX;^KJvGK9D={xU-zg_QJ*K!Qd9x;G G2MYj}IuN1& delta 59 zcmZ1_y-}KXIWI340}w3T{~}}AM&7?1^7hVFF)mq&dFlC1Ir-@^Ir+(nIY diff --git a/src/oauth/migrations/__pycache__/__init__.cpython-311.pyc b/src/oauth/migrations/__pycache__/__init__.cpython-311.pyc index 7f5dc491eced5822c6f9d30733522cd61201ac11..dfc6228d04d919ba539fa6101df30547b169fec7 100644 GIT binary patch delta 48 zcmZ3%xR8-&IWI340}u$+a%4{AF_AEFv5G0lFHKL4amh-|OV4-8$xn|dE=ryl?+E}W C2@XyG delta 55 zcmZ3;xPp;qIWI340}w3T{~}`|kBPjsvsH{sR$^XyzEe(qdQ47!a$*jWz{Cho0M=s? AegFUf diff --git a/src/oauth/templatetags/__pycache__/__init__.cpython-311.pyc b/src/oauth/templatetags/__pycache__/__init__.cpython-311.pyc index 6d11ed24547d21196e6a573e7d4b0356e2599335..100233a4583b61c894ea4cf04fe3093e69e42937 100644 GIT binary patch delta 49 zcmZ3*xR{Z5IWI340}u$+a%3`17k#_@=yuGtkj7wHxUV6S$PJVh!PJVJ?4wAs;t4!OO E04|Rdh5!Hn diff --git a/src/owntracks/__pycache__/__init__.cpython-311.pyc b/src/owntracks/__pycache__/__init__.cpython-311.pyc index fe145cac6349b5f3bbe69101adfa82054ad037ca..c716a615f90f2e9f1cb0070583bea80a3d955375 100644 GIT binary patch delta 48 zcmZ3;IE#^IIWI340}u$+a%4{AF_F-9v5G0lFHKL4amh-|OV4-8$xn|dE=ryl?*srN Cvko!< delta 55 zcmbQmxR8-&IWI340}w3T{~}`|kBPjAvsH{sR$^XyzEe(qdQ47!a$*jWz{ChA0MdFA AVgLXD diff --git a/src/owntracks/__pycache__/admin.cpython-311.pyc b/src/owntracks/__pycache__/admin.cpython-311.pyc index a166500d3df3cc139334b3875fa3659c1da04495..c959ad8d69699064dcc84fd6f3b2cb9a5ccc83aa 100644 GIT binary patch delta 49 zcmcc5e1n;HIWI340}u$+a%9#_}N`M>0%XAl3$vh8sn0cn3taKl#`zxQ(TlhnTzo< E0Bm;;_W%F@ delta 57 zcmcb{e3zMbIWI340}w3T{~{xHBJVwU181ukm#oCR^n9nB{PdWd{N%(OB!S7yjF$l` C6BHr< diff --git a/src/owntracks/__pycache__/models.cpython-311.pyc b/src/owntracks/__pycache__/models.cpython-311.pyc index eb4a9231c78b337b6ee5f48543ffa114ddfc9c24..469d0a12cca28454a66aa5471bd911df4164bb1b 100644 GIT binary patch delta 52 zcmeC delta 59 zcmZqY?&IcN&dbZi00c|-zsQK*$ji$lZ{%zhIWI340}w3T|01JyBky}gc>`yw7?-TXy!3phoc#2doc!d(93+9sB1|U$ DLbDW$ diff --git a/src/owntracks/__pycache__/views.cpython-311.pyc b/src/owntracks/__pycache__/views.cpython-311.pyc index c1aeb6ba891c946ea4d53cd764597ecd7475a352..f5f09cfaae3fdfce908502975c4e5cc6b28dd454 100644 GIT binary patch delta 52 zcmca=bIyi$IWI340}$-tkk353k@q``gqDj{Oi6xedTNYIR$^XyzEe(qdQ5Rq@@8dL GBS`?aP7wnD delta 59 zcmX?SbJd1-IWI340}w3T|02V0Bky+>c|&Kb7?-TXy!3phoc#2doc!d(93+9wGOR|D E0An%~XaE2J diff --git a/src/owntracks/migrations/__pycache__/0001_initial.cpython-311.pyc b/src/owntracks/migrations/__pycache__/0001_initial.cpython-311.pyc index 57892bb90edf9852562255660a89d2e25f4bbb8f..c9a8adc49f96f739c7d1ee17798eea58c7bdddbf 100644 GIT binary patch delta 52 zcmcb}eTtiRIWI340}u$+a%5_5|mIWI340}w3T{~{xKBd;!#e4MjYj7wHxUV6S$PJVh!PJVJ?4wAs;Af`M< E05KyIuK)l5 diff --git a/src/owntracks/migrations/__pycache__/__init__.cpython-311.pyc b/src/owntracks/migrations/__pycache__/__init__.cpython-311.pyc index a01f9cb47923d200bc7ab7abda3015a827d82158..48f58ed33b70dec05e60ff9f35f0cf3ce6ac9b72 100644 GIT binary patch delta 48 zcmZ3(xRjA+IWI340}u$+a%4{AF_Exvv5G0lFHKL4amh-|OV4-8$xn|dE=ryl?+XAZ C@eW=9 delta 55 zcmZ3=xQ3BuIWI340}w3T{~}`|kBPj!vsH{sR$^XyzEe(qdQ47!a$*jWz{Ch&0N9@r AjsO4v diff --git a/src/plugins/__pycache__/__init__.cpython-311.pyc b/src/plugins/__pycache__/__init__.cpython-311.pyc index 9c02a78200a31a816bffc0f8a7a52b644a80ac75..70fde4566e0f7330cbfbdc5a8b667e6eadb169cb 100644 GIT binary patch delta 49 zcmbQwID?UQIWI340}u$+a%5^wSsIWI340}w3T{~|+UBCoN$k+W5dOIBiDdcIRmetJw!esW?ClEB0W2LRk| B5`zE$ diff --git a/src/plugins/article_copyright/__pycache__/__init__.cpython-311.pyc b/src/plugins/article_copyright/__pycache__/__init__.cpython-311.pyc index 84122cb5f37224a554e80711ca8ac7d6a468f1f8..a0ed6db5a179547ca44d964f40fbd87c02a20aef 100644 GIT binary patch delta 49 zcmdnUxQdZ?IWI340}u$+a%5^wAOPl| B63YMp diff --git a/src/plugins/article_copyright/__pycache__/plugin.cpython-311.pyc b/src/plugins/article_copyright/__pycache__/plugin.cpython-311.pyc index 61a131156f5abcbf81743a6d4057f55ef12cbbc7..d00d5e4d418b70f1dcd98346e166cc89fb9e5050 100644 GIT binary patch delta 53 zcmbQiKarnrIWI340}$-tkk8~{+sG%+Bw_7h6;qO5nw}ctl9ia3p6`^CpB__Ol)Tx8 H$%hpHUk?u1 delta 60 zcmbQpKZBodIWI340}w3T|03f#>qb6#CV3}ks~DH8#Ju!;r=0xsn4J9N#2h4n&8|#7 FtN=B36PEx0 diff --git a/src/plugins/article_recommendation/__pycache__/__init__.cpython-311.pyc b/src/plugins/article_recommendation/__pycache__/__init__.cpython-311.pyc index f9a74fe9401d0afe66295e86386effc0093f844e..150957083dee0fae752e8edc5eff358cf3d98ed8 100644 GIT binary patch delta 49 zcmdnSxSo-BIWI340}$-tkk1sG$ZIU&Z~*3z B63hSq diff --git a/src/plugins/article_recommendation/__pycache__/plugin.cpython-311.pyc b/src/plugins/article_recommendation/__pycache__/plugin.cpython-311.pyc index c6a8c65e8671b1a4b3d5bdfdbea960c6a38d397e..d69ec028f1a14f1efebd5852f059b99a78e5aba1 100644 GIT binary patch delta 53 zcmdn)yTO-lIWI340}$-tkk90m+sG%wEaBi{6;qO5nw}ctl9ia3p6`^CpB__Ol)TxK HIZqh?h;R?> delta 73 zcmdnsyWN*>IWI340}w3T|02Udb|aq*vxd8~Rg6nkVqSW_Q%-(*Oiq4sVh*xEK~8CU RW?pg3x`IWI340}w3T{~|+UBCoN$qq9|vOIBiDdcIRmetJw!esW?ClEB0We*om| B62AZd diff --git a/src/plugins/external_links/__pycache__/plugin.cpython-311.pyc b/src/plugins/external_links/__pycache__/plugin.cpython-311.pyc index 02b4df3c2861285d572b2dde57aa6ef25ede253e..f3b0e85f4862b7ded1936153a78ad8b3f7989eef 100644 GIT binary patch delta 52 zcmX>udO(zSIWI340}u$+a%9?XgdR&xuIWI340}w3T|008bBX2yDyuGtkj7wHxUV6S$PJVh!PJVJ?4wAs;7A6}G E04+olkpKVy diff --git a/src/plugins/image_lazy_loading/__pycache__/__init__.cpython-311.pyc b/src/plugins/image_lazy_loading/__pycache__/__init__.cpython-311.pyc index d64914bf2652aa84c626539a9a50884e02b333fd..a006310339ff0ab196a955a55e2d270154098720 100644 GIT binary patch delta 49 zcmdnQxSEl7IWI340}$-tkk6Ez$ZITN=VBF8l3$vh8sn0cn3taKl#`zxQ(TlhF+Lao DJ;@H> delta 56 zcmZ3@xQUT>IWI340}w3T{~|+XBCoN$tFu*%OIBiDdcIRmetJw!esW?ClEB1>U;yP^ B62kxh diff --git a/src/plugins/image_lazy_loading/__pycache__/plugin.cpython-311.pyc b/src/plugins/image_lazy_loading/__pycache__/plugin.cpython-311.pyc index 86ecbe0bbf71b8b6d885dd19c24899db98dc64a3..d8661613430da25bf287754e826fc496a0e37f3d 100644 GIT binary patch delta 53 zcmexr@y>#8IWI340}$-tkk1T}+Q=8cEMenf6;qO5nw}ctl9ia3p6`^CpB__Ol)Sl? H`G*7ms+SRE delta 60 zcmaE7@zsKFIWI340}w3T{~}|aA delta 59 zcmaDU_(70&IWI340}w3T{~}}UMqUXfd0S_z7?-TXy!3phoc#2doc!d(93+9wwoGf- E08FJ6R{#J2 diff --git a/src/plugins/seo_optimizer/__pycache__/__init__.cpython-311.pyc b/src/plugins/seo_optimizer/__pycache__/__init__.cpython-311.pyc index 0473a4758dab4e0443c947982206c3fdca100f0c..46c3305647009221d7a82ed04eb1debcf23daaa5 100644 GIT binary patch delta 49 zcmZ3>xQvl^IWI340}u$+a%5^wk diff --git a/src/plugins/view_count/__pycache__/__init__.cpython-311.pyc b/src/plugins/view_count/__pycache__/__init__.cpython-311.pyc index 287c667b1e015411ab702faf91631af97159edd8..3f40557cefcf9ad953a0a98a1b802b9a0e90311d 100644 GIT binary patch delta 48 zcmZ3*xR{Y=IWI340}u$+a%4{AF_AEHv5G0lFHKL4amh-|OV4-8$xn|dE=ryl?+pMa C{SHfz#B&dbZi00c|-zsUH1Q<7hro*Ltlm6(^F@063D9#dSDyxEuW GJQDzFg%8RA delta 59 zcmbQrF^7Y9IWI340}w3T|03hUMqWimc~fVr7?-TXy!3phoc#2doc!d(93+9wZj9%d E04U89=Kufz diff --git a/src/servermanager/__pycache__/apps.cpython-311.pyc b/src/servermanager/__pycache__/apps.cpython-311.pyc index 800626a73189566a17cc16c3f237d3f456ffcbe0..0341712a8068ff7584aed3f2f6476e43dc8f54c0 100644 GIT binary patch delta 50 zcmaFK{D_%%IWI340}u$+a%5&rtYpCl3$vh8sn0cn3taKl#`zxQ(TlhS%~pE E0CSTNF8}}l delta 57 zcmaFF{F0e>IWI340}w3T{~{xGBJVSK6KAU!m#oCR^n9nB{PdWd{N%(OB!S7?jMo7( CV-#8d diff --git a/src/servermanager/__pycache__/models.cpython-311.pyc b/src/servermanager/__pycache__/models.cpython-311.pyc index 3d3ace96c89c6531746c58fcf9242f140f864e99..29581c7767fc30901d823f1d8822608806b39c74 100644 GIT binary patch delta 52 zcmcaDd_|adIWI340}u$+a%5(01Q<7hro*Ltlm6(^F@063D9#dSDym=~z GrXm2MV-V5+ delta 59 zcmdlUyf2t{IWI340}w3T|02VFBX1^$ys5KQj7wHxUV6S$PJVh!PJVJ?4wAs;J`PPq E08QHzM*si- diff --git a/src/servermanager/__pycache__/urls.cpython-311.pyc b/src/servermanager/__pycache__/urls.cpython-311.pyc index 52b284232141b7fd40a5abfd58369c6d8217f2fc..f6fb85bba0db7012ac4c2c2194771c56749fb1b7 100644 GIT binary patch delta 51 zcmX@de4LqgIWI340}u$+a%3Lf$ji+rq3dE5Q<7hro*Ltlm6(^F@063D9#dSDJlULa FIsjx@4}Aat delta 58 zcmX@ke2$rSIWI340}w3T{~}}OMqX}4c@t-=7?-TXy!3phoc#2doc!d(93+9s28`1I DAnFsN diff --git a/src/servermanager/api/__pycache__/__init__.cpython-311.pyc b/src/servermanager/api/__pycache__/__init__.cpython-311.pyc index 762663200d33db9679c9c69287871fc4e6c07534..9c8d179849707656f97d9f9d01d03bd8a637a585 100644 GIT binary patch delta 49 zcmZ3pcSw$RIWI340}u$+a%3Le$ormI!py}grX;^KJvGK9D={xU-zg_QJ*K!Qd9yT& G9yb7)-w;Cp delta 59 zcmX>kcT$dbIWI340}w3T|01JxBky}=d0S_z7?-TXy!3phoc#2doc!d(93+9wA}o5` E09l0;GXMYp diff --git a/src/servermanager/migrations/__pycache__/0001_initial.cpython-311.pyc b/src/servermanager/migrations/__pycache__/0001_initial.cpython-311.pyc index 82cbef5b5bb5346e4478b4f3a7bd23e7bf009a5f..43518fd543afe7f88aa80244a98f44a8d353bdcc 100644 GIT binary patch delta 52 zcmew^@IiogIWI340}u$+a%3*r$lJ~;;oxEwQ<7hro*Ltlm6(^F@063D9#dSDym>S0 G5hehc*byoK delta 59 zcmew$@Lhm+IWI340}w3T|01JwBX2vayt}hij7wHxUV6S$PJVh!PJVJ?4wAs;HLORN E09xY}EdT%j diff --git a/src/servermanager/migrations/__pycache__/0002_alter_emailsendlog_options_and_more.cpython-311.pyc b/src/servermanager/migrations/__pycache__/0002_alter_emailsendlog_options_and_more.cpython-311.pyc index 90d91e425851f794577889028454de6a6fedc863..1a0b01779f3bc22695eab142135a2eb98349f72b 100644 GIT binary patch delta 52 zcmeC?Y~kcx&dbZi00cs{9GOct@~&c%h;gxsDakKQPmOWOO3X{ocgo36k0~xn-h7Q| GD + +{% endblock %} + +{% block content %} +
+
+
+

{% trans "Create Article" %}

+
+ {% csrf_token %} +
+ + {{ form.title }} + {% if form.title.errors %} +
+ {{ form.title.errors }} +
+ {% endif %} +
+ +
+ + {{ form.body }} + {% if form.body.errors %} +
+ {{ form.body.errors }} +
+ {% endif %} +
+ +
+
+
+ +
+
+ + {{ form.status }} + {% if form.status.errors %} +
+ {{ form.status.errors }} +
+ {% endif %} +
+ +
+ + {{ form.comment_status }} + {% if form.comment_status.errors %} +
+ {{ form.comment_status.errors }} +
+ {% endif %} +
+
+ +
+
+ + {{ form.type }} + {% if form.type.errors %} +
+ {{ form.type.errors }} +
+ {% endif %} +
+ +
+ + {{ form.category }} + + {% for category in all_categories %} + + {% if form.category.errors %} +
+ {{ form.category.errors }} +
+ {% endif %} +
+
+ +
+ + {{ form.tags }} + + {% for tag in all_tags %} + + {% if form.tags.errors %} +
+ {{ form.tags.errors }} +
+ {% endif %} +
+ +
+ {{ form.show_toc }} + + {% if form.show_toc.errors %} +
+ {{ form.show_toc.errors }} +
+ {% endif %} +
+ +
+ + {% trans "取消" %} +
+
+
+
+
+{% block extra_js %} + +{% endblock %} + +{% endblock %} \ No newline at end of file diff --git a/src/templates/blog/article_edit.html b/src/templates/blog/article_edit.html new file mode 100644 index 0000000..1a333ab --- /dev/null +++ b/src/templates/blog/article_edit.html @@ -0,0 +1,341 @@ +{% extends "share_layout/base.html" %} +{% load static %} +{% load i18n %} + +{% block title %}{% trans "Edit Article" %}{% endblock %} + +{% block header %} +{{ block.super }} + + +{% endblock %} + +{% block content %} +
+
+
+

{% trans "Edit Article" %}: {{ article.title }}

+
+ {% csrf_token %} +
+ + {{ form.title }} + {% if form.title.errors %} +
+ {{ form.title.errors }} +
+ {% endif %} +
+ +
+ + {{ form.body }} + {% if form.body.errors %} +
+ {{ form.body.errors }} +
+ {% endif %} +
+ +
+ {% for image in article.images.all %} +
+
+ {{ image.description|default:'图片' }} +
+

{{ image.description|default:'无描述' }}

+
+ + +
+
+
+
+ {% endfor %} +
+
+
+ +
+
+ + {{ form.status }} + {% if form.status.errors %} +
+ {{ form.status.errors }} +
+ {% endif %} +
+ +
+ + {{ form.comment_status }} + {% if form.comment_status.errors %} +
+ {{ form.comment_status.errors }} +
+ {% endif %} +
+
+ +
+
+ + {{ form.type }} + {% if form.type.errors %} +
+ {{ form.type.errors }} +
+ {% endif %} +
+ +
+ + {{ form.category }} + + {% for category in all_categories %} + +
选择现有分类或创建新分类
+ {% if form.category.errors %} +
+ {{ form.category.errors }} +
+ {% endif %} +
+
+ +
+ + {{ form.tags }} + + {% for tag in all_tags %} + +
选择现有标签或创建新标签,多个标签用逗号分隔
+ {% if form.tags.errors %} +
+ {{ form.tags.errors }} +
+ {% endif %} +
+ +
+ {{ form.show_toc }} + + {% if form.show_toc.errors %} +
+ {{ form.show_toc.errors }} +
+ {% endif %} +
+ +
+ + {% trans "取消" %} +
+
+
+
+
+{% block extra_js %} + + +{% endblock %} + +{% endblock %} \ No newline at end of file diff --git a/src/templates/blog/image_upload.html b/src/templates/blog/image_upload.html new file mode 100644 index 0000000..65c309b --- /dev/null +++ b/src/templates/blog/image_upload.html @@ -0,0 +1,49 @@ + + + + + 上传图片 + + +
+ {% csrf_token %} + {{ form.as_p }} + +
+ + + + diff --git a/src/templates/blog/my_articles.html b/src/templates/blog/my_articles.html new file mode 100644 index 0000000..e2053f1 --- /dev/null +++ b/src/templates/blog/my_articles.html @@ -0,0 +1,66 @@ +{% extends "share_layout/base.html" %} +{% load static %} +{% load i18n %} + +{% block title %}{% trans "My Articles" %}{% endblock %} + +{% block content %} +
+
+
+
+

{% trans "My Articles" %}

+ + {% trans "发布新文章" %} + +
+ + {% if articles %} +
+ + + + + + + + + + + + + {% for article in articles %} + + + + + + + + + {% endfor %} + +
{% trans "标题" %}{% trans "状态" %}{% trans "分类" %}{% trans "创建时间" %}{% trans "浏览量" %}{% trans "操作" %}
+ {{ article.title }} + + {% if article.status == 'p' %} + {% trans "已发布" %} + {% else %} + {% trans "草稿" %} + {% endif %} + {{ article.category.name }}{{ article.creation_time|date:"Y-m-d H:i" }}{{ article.views }} + + {% trans "编辑" %} + +
+
+ {% else %} +
+ {% trans "您还没有创建任何文章。" %} + {% trans "创建您的第一篇文章" %} +
+ {% endif %} +
+
+
+{% endblock %} \ No newline at end of file diff --git a/src/templates/blog/tags/article_meta_info.html b/src/templates/blog/tags/article_meta_info.html index ec8a0f9..6a0c12f 100644 --- a/src/templates/blog/tags/article_meta_info.html +++ b/src/templates/blog/tags/article_meta_info.html @@ -50,6 +50,8 @@ {% if user.is_superuser %} {% trans 'edit' %} + {% elif user.is_authenticated and user == article.author %} + {% trans 'edit' %} {% endif %} diff --git a/src/templates/blog/tags/sidebar.html b/src/templates/blog/tags/sidebar.html index ecb6d20..aa10fd5 100644 --- a/src/templates/blog/tags/sidebar.html +++ b/src/templates/blog/tags/sidebar.html @@ -119,6 +119,8 @@ \ No newline at end of file