From 713d5adc4eb782e4e1f0af62bccbb7f0ba047765 Mon Sep 17 00:00:00 2001 From: Alberto Olmos Date: Mon, 13 Jul 2026 19:51:12 +0000 Subject: [PATCH 1/6] Finish Introduction Django and Admin --- blango/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 0 -> 2498 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 0 -> 904 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 0 -> 531 bytes blango/settings.py | 17 ++++++-- blog/__init__.py | 0 blog/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 0 -> 532 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 0 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 0 -> 1181 bytes blog/admin.py | 11 +++++ blog/apps.py | 6 +++ blog/migrations/0001_initial.py | 39 ++++++++++++++++++ blog/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-36.pyc | Bin 0 -> 1231 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 139 bytes blog/models.py | 23 +++++++++++ blog/tests.py | 3 ++ blog/views.py | 3 ++ db.sqlite3 | Bin 0 -> 163840 bytes 20 files changed, 98 insertions(+), 4 deletions(-) create mode 100644 blango/__pycache__/__init__.cpython-36.pyc create mode 100644 blango/__pycache__/settings.cpython-36.pyc create mode 100644 blango/__pycache__/urls.cpython-36.pyc create mode 100644 blango/__pycache__/wsgi.cpython-36.pyc create mode 100644 blog/__init__.py create mode 100644 blog/__pycache__/__init__.cpython-36.pyc create mode 100644 blog/__pycache__/admin.cpython-36.pyc create mode 100644 blog/__pycache__/apps.cpython-36.pyc create mode 100644 blog/__pycache__/models.cpython-36.pyc create mode 100644 blog/admin.py create mode 100644 blog/apps.py create mode 100644 blog/migrations/0001_initial.py create mode 100644 blog/migrations/__init__.py create mode 100644 blog/migrations/__pycache__/0001_initial.cpython-36.pyc create mode 100644 blog/migrations/__pycache__/__init__.cpython-36.pyc create mode 100644 blog/models.py create mode 100644 blog/tests.py create mode 100644 blog/views.py create mode 100644 db.sqlite3 diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc3efc730f1899f91aee6f9439fd6f99a21cda21 GIT binary patch literal 130 zcmXr!<>h*(9-74f1dl-k3@`#24nSPY0whuxf*CX!{Z=v*frJsnFMa)t{M=Oi=#N<@{q@2XO^n4fCdOlw)?h~81hEIU&o^g*McBvRJpf>0EhU+JmkGYYDAY6jE!$0Gn zqjw!42aZcPY9so<@Tp^S`1MaH#-kQ_is4D|#P^5Z&w>C>&*R52CK>dcfk12l0R`U~ z(w-+w@)gGL{t4lZN0!A|)bly#_~LyG8!!-|F89f>M#TF+v0QRI73lA%p;~1oWDgDh zB-l%6pteVPBbQV*J$oI7#@g14pEk|S_1)dz<;MH|`;V2;uD#ZO^61nme|~AK>)X!o zbr3w;+^(o0vk}aT&8B=*skh|=PAgUAT0_>~$cow$52T<}d9k&%#rGVb4o{t+Fd->q zTaHbFm2nbiVEZoZ@^MXq8?(|8=6i2O7`YJJ_s@pJ3sz^89`QV^(q+W}6^4l(cV|6( ztZOf-rl+x8%Q1sWVlkiq7CALs!pBTe|BP26%5ZaVt_yZ&0h1K?DSu@woAN4O4uZ`x zaBRLBKc-Bd&jc`#m1%Ghe$F+Qi_8x9j)nGN%MV)d=ms%dPk(N@BOczCGCyS#j;HsqEPtR`%o zdM4$K;m}IT5axj#8zaj)2t&Bz}19H@)7*3hGIZgez60 zUDvC!{I((K3Tl*wDkW02-BDBolG_cey%H|}$5yI#+ERE^krV~H?Hpn(UY!+BkV^=p zVulEd4XcF3gGQ~^l#WEiT4>9%s(0GWs@$rFbER-Vr#!6?n{_lO+vs1zPKi17Z*CnUt{}4 zYrJc2Z?(c)BvUn{RK*z8D35TtCe_7GQ`Iqstk)Y-v-U^I-N5q1w|@lT#2FAF{woo% z?LT-!qeq1C+)W;nzg2#C78ZWNJ{Vc#)jVQ&UA(dB0<*v_<=G6I&M_+t%iO{hU)eNs japl-}pH4G5mObB(^`#t}k9MVEE)!kF0-H{*9Gm?Y#_BUK literal 0 HcmV?d00001 diff --git a/blango/__pycache__/urls.cpython-36.pyc b/blango/__pycache__/urls.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1f7dab6135e7a61cedb4646e6639afa8b5b75446 GIT binary patch literal 904 zcma)4!EV$r5KXe#ZAn}Bg}G%TmKfUGiXu=&MJ2=m=w&adH}>v&iS5XCDCNr6@JqRJ zLPC51C&t;V6d@tiQk;o1e)Ha&IXgK?ey7*lUr`YJ2nK6}@k@N{Q`}gv2w2FXDwNS8 z3Vl4PMlxQ+VZdV+^JqKXPQFF!aB;xKAA)Q`H3BXxs@58=-@kS z;ifTFO`YRL*&C>YbzpSkxb+t-I1Qf#zqL7BY6DUm4nnQ8ksSoo6{nVi<$Rt1u8niG zofE=zX>+#qg=?d?ymWb~CE<#k<)_5yT9lUfWP;@_NnU@U60z(&xolMF+3m`9pwDu6 z#TZZpLe|>2Il#(j3G%L>b=@Bh@=yExPBID@D8#EMb~8=WS+8rOC7*$!lAotOPP62q zqSiiHqA)f<{T~bMHr#k3d1us~&Ktz)*x!?l&(EnXJjgWrhtZWPtA+`+MiaVvURsIG z-1~FY83RZK+v9WjG=o)d<$Pz?t{u5Id{45^opq+%o9(jFYk~&uE2aLR!%ed+`H7Pn zWMMm|ObUfT>>d9)=|0K3?65s33Y?FkSUl`0p%Q1r(%`TL?a_dz@$=utRyf|qo_KpS zXy*68Ji!0m_UAG2-6N%DLX%rMrcBVQHVK9%kSog;O2Z+u0Ljw1+8%Q*F}JBKTT{=Ta;!KQew2RXOI$nT5^9Zi z6&T0Ywop9z8>T@f!^poWz-8@Qwq?V=Jw5+28C_)4v&+lzWHimbUz}cjJG+0?eLl6| zoHB(S_I*Fgf`csc6s>>V`AG9%KW$kX8gzUg%t|$Ad=eTZEX1vLes4?gH))bkxPku% r!E^;YN2!pnvAMCe$bom#&!Htx>pMUA)D8D!5c+KkJvyK-=u7$pF5;$y literal 0 HcmV?d00001 diff --git a/blango/settings.py b/blango/settings.py index f9209bef27..a173c26078 100644 --- a/blango/settings.py +++ b/blango/settings.py @@ -10,8 +10,10 @@ https://docs.djangoproject.com/en/3.2/ref/settings/ """ +import os from pathlib import Path + # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent @@ -25,8 +27,14 @@ # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True -ALLOWED_HOSTS = [] - +ALLOWED_HOSTS = ['*'] +X_FRAME_OPTIONS = 'ALLOW-FROM ' + os.environ.get('CODIO_HOSTNAME') + '-8000.codio.io' +CSRF_COOKIE_SAMESITE = None +CSRF_TRUSTED_ORIGINS = ['https://' + os.environ.get('CODIO_HOSTNAME') + '-8000.codio.io'] +CSRF_COOKIE_SECURE = True +SESSION_COOKIE_SECURE = True +CSRF_COOKIE_SAMESITE = 'None' +SESSION_COOKIE_SAMESITE = 'None' # Application definition @@ -37,16 +45,17 @@ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'blog', ] MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', + #'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', + #'django.middleware.clickjacking.XFrameOptionsMiddleware', ] ROOT_URLCONF = 'blango.urls' diff --git a/blog/__init__.py b/blog/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/blog/__pycache__/__init__.cpython-36.pyc b/blog/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0210ae62419ca88df4ccd3db07260a6736979f28 GIT binary patch literal 128 zcmXr!<>eC92+d*ug2x~N1{i@12OutH0TL+;!3>&=ek&P@K*9*(m#%(Ber~FMa(+r? zzJ7UrQFd`bVsff}QchxCdOncKPuGu+&&Nkj6EY zUS5IV94&o7XPM%_Q~?}H$CZGYk|0rTo)3umg|xCve(G{Ly3yNQ57WxKbZbGI@v`A@ zjyg>dXBc8dxXhK-Thm*u^Fr%Bz~l+nTHjB`KUdxl(GFplyctpI##s+3*Qh*daB1-7 z;gQ8-5+(Qdq`eKjZPx)@Xn%%ymj<)8?aG^N7chjb-7mfz9%6|Enkvz`D_-$^=CV0Z z$FQOP_?#4)W;QD7z#54U!s%~iA=&SYa=e4~#2MfQ5H!#$xlM5;bL Tt@{~&o+Ua*&EJZ;cqjh>Rked~ literal 0 HcmV?d00001 diff --git a/blog/__pycache__/apps.cpython-36.pyc b/blog/__pycache__/apps.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd3c0d7665fc118bce07cc32605dc56f45b0e327 GIT binary patch literal 397 zcmYLFu};G<5Ix7K6w-D~8Z80H2h95mGgyw5J3J$TZX}XAEut1LSXjT(MW42N>Q$ zGWsGGB+MPm+xE&d>#AJ&&TlX(W|a1bKtawBNXc@JK^`Kf4WWw{+LVL#Ibg#Q4UJz8;pHrOOFM-2`k7+CV9eA9&%3D zNQ~4BP0n63X-eycNlWpmb!~<=GPZP(aTXazwvO4ry~8YQz-uSXrAi7Qw@_snXX9c- zzwRFsU=vn6fm1Bxl7)scrxaFZeUodo}jcJ|Q45IO!#8}MerO~BGR5mUrBaRe3 z^d;MZ6%O1dHf5;f`zWwKL`kIptU@JcUzl!Vz>lZHNuH|VD3@_QyvX%=F^fiOc$!4n zIL9X+59f#2m|fK^A&OE9;nMuz5UYLcU{4#1{QjU-yFz49s)VRLAy8T+gnc32S5Y$m zqp7rR2kNrija4Fb3$gByqdhG-k3wpW4J!z^+&7xcA4LA@-)9V2CQ{i`2ZXjHzcoS^ zs4Wd?f?98ZE#S@q8`8!oA5mALllapE?q9QTrOCNX?g3%sR`GqP)?{0HsCpzj(!XKh zy6l4RUTq!bMG3Ooc_yF%RjL4yA5~>8viw3sQX+QmS6p1 zEe-7%<|8HfS|w4bWW(}*cD{_u1fAE^x4+pX+Sg(C{q$+$zZ?2k`&85=*CW^T&fCqk zipSYob)`wfb^p~#@J5^*?;MG}gYBJnb?flxAlTUoLI+2jzZYd! zK~8?IE0RTRmC?BPx4Kp^hBzqJ;9S1SeY`ywlm_b=nnsYa+j2^mVnd$JN$4zMEPpm< i!QP|$-pI45TH?A9Hp#hmU(9dCOS-AeEyarFs`C?OpAeD& literal 0 HcmV?d00001 diff --git a/blog/admin.py b/blog/admin.py new file mode 100644 index 0000000000..ef8df43de3 --- /dev/null +++ b/blog/admin.py @@ -0,0 +1,11 @@ +from django.contrib import admin +from blog.models import Tag, Post + +# Register your models here. +admin.site.register(Tag) + +class PostAdmin(admin.ModelAdmin): + prepopulated_fields = {"slug": ("title",)} + list_display = ("slug", "published_at") + +admin.site.register(Post, PostAdmin) \ No newline at end of file diff --git a/blog/apps.py b/blog/apps.py new file mode 100644 index 0000000000..94788a5eac --- /dev/null +++ b/blog/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class BlogConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'blog' diff --git a/blog/migrations/0001_initial.py b/blog/migrations/0001_initial.py new file mode 100644 index 0000000000..326016aac8 --- /dev/null +++ b/blog/migrations/0001_initial.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.5 on 2026-07-13 19:07 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Tag', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('value', models.TextField(max_length=100)), + ], + ), + migrations.CreateModel( + name='Post', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('modified_at', models.DateTimeField(auto_now=True)), + ('published_at', models.DateTimeField(blank=True, null=True)), + ('title', models.TextField(max_length=100)), + ('slug', models.SlugField()), + ('summary', models.TextField(max_length=500)), + ('content', models.TextField()), + ('author', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), + ('tags', models.ManyToManyField(related_name='posts', to='blog.Tag')), + ], + ), + ] diff --git a/blog/migrations/__init__.py b/blog/migrations/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/blog/migrations/__pycache__/0001_initial.cpython-36.pyc b/blog/migrations/__pycache__/0001_initial.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..acb1e9bd030c5b05c002ed97a79df892ee6567ab GIT binary patch literal 1231 zcmZuxy>r_(6emGaq9{tX6D4iZCfA{h7Rk8|>Gg8GeAsS#t&?0VFI;$#9!!G<36`MZ zC~La<56R!t?X8`%_d0ay11TpNN*=)Xg@@n!J%HbhM$zTN)BMlCasF~Xdwh}~(=b2K z1P-{$Dcr<$t;`fFyu>T~#BX&^1xfEG2Yd+ra3By~-hbyMeeh14Y3~EAccw0eMl_8q zGc#ov6*8-NBXw!8S7;E*JYU(k>t~OI$2818Gzlkh!ATgni6{I#5IxH8W^NLaHUI{m zi1H!0^b!K-UHNAW`echCgu#`2#xe%c6>Fo1{~H}s^oZ7vY&49w+D@zOZZ#M7t{8c5 ze4ZI@k~V(lkbTnHZ*@DuZL78RFG$)EyZK%oIWmxHN~F<&=2UDbj&0&rN>vf%Y5y$~B57*R{E2K|@XG#G8ur@W!~ZpTtz zrW|NTYMZ2J=$v5-hnyH!>!p(Byz?*&mWr1blz*)h290c#K;Ni!hJCXxENJ<+>p0k7 z>9P@JgFQ-hu4}?H&}B+zLo@P?mpL zhH0y(DMo2ZXxB=R9H;5;Yp!gyr1fPf8{(?=Xc11#C9f*Jq(BgrC_$8~P0g%p=gH~f z=k)aC@Kt*J;^6Q%j6X(5VQ~1YZN#xX%C)^Z7(bQS6Kc_sB@_n>@uum-(E&kS$UPl>H)O)9X zNC?{L-$(OvU5NRLnx*HLy1peC92+d*ug2x~N1{i@12OutH0TL+;!3>&=ek&P@K*9*(mxX>ter~FMa(+r? zzJ7UrQFd`bVsff}QchxCdOncKPuI`QOfO0-$;{6y){l?R%*!l^kJl@xyv1RYo1ape MlWGStu^5OM03$9T5&!@I literal 0 HcmV?d00001 diff --git a/blog/models.py b/blog/models.py new file mode 100644 index 0000000000..9aa2ea3ea8 --- /dev/null +++ b/blog/models.py @@ -0,0 +1,23 @@ +from django.db import models +from django.conf import settings + +# Create your models here. +class Tag(models.Model): + value = models.TextField(max_length=100) + + def __str__(self): + return self.value + +class Post(models.Model): + author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT) + created_at = models.DateTimeField(auto_now_add=True) + modified_at = models.DateTimeField(auto_now=True) + published_at = models.DateTimeField(blank=True, null=True) + title = models.TextField(max_length=100) + slug = models.SlugField() + summary = models.TextField(max_length=500) + content = models.TextField() + tags = models.ManyToManyField(Tag, related_name="posts") + + def __str__(self): + return self.title diff --git a/blog/tests.py b/blog/tests.py new file mode 100644 index 0000000000..7ce503c2dd --- /dev/null +++ b/blog/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/blog/views.py b/blog/views.py new file mode 100644 index 0000000000..91ea44a218 --- /dev/null +++ b/blog/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/db.sqlite3 b/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..29405ee0ee1c4e4fe32ca6c0751311ba0f3d623e GIT binary patch literal 163840 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 a1V8`;KmY_l00cl_KM`=+*#-bM{{LV5KCA@* literal 0 HcmV?d00001 From e1b1daae0e822795483347d1175ef25c57b05c9e Mon Sep 17 00:00:00 2001 From: Alberto Olmos Date: Mon, 13 Jul 2026 23:05:13 +0000 Subject: [PATCH 2/6] Finish generic relationships --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 2498 -> 2498 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 904 -> 904 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 531 -> 531 bytes blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 532 -> 532 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 1181 -> 1780 bytes blog/admin.py | 11 +++---- blog/migrations/0002_comment.py | 29 ++++++++++++++++++ .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 0 -> 1135 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes blog/models.py | 14 +++++++++ db.sqlite3 | Bin 163840 -> 180224 bytes 15 files changed, 48 insertions(+), 6 deletions(-) create mode 100644 blog/migrations/0002_comment.py create mode 100644 blog/migrations/__pycache__/0002_comment.cpython-36.pyc diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index dc3efc730f1899f91aee6f9439fd6f99a21cda21..1b628dcbace391e2014b7e70dadb6ef95d881d0c 100644 GIT binary patch delta 14 VcmZo-Y+__H=H=xw&Y8$o0{|6D0~P=P delta 14 VcmZo-Y+__H=H=yjr#_Lb1^^e`1B?Iw diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index 1753e8cce27e5e6e56f6707e97634dcd5749354d..829b5707f19e42cc63c4baf9002279bc32952c11 100644 GIT binary patch delta 15 WcmX>kd`Othn3tE!IAxvJp>~F delta 15 WcmX>kd`Othn3tF9gz-kUJ)8g}o&YXZjr diff --git a/blog/__pycache__/apps.cpython-36.pyc b/blog/__pycache__/apps.cpython-36.pyc index dd3c0d7665fc118bce07cc32605dc56f45b0e327..323987db89d6d01dcdff6e773ff3f68f21e68b0c 100644 GIT binary patch delta 15 WcmeBW?qy~(=H=xw&e_P;&IkY+UjtkK delta 15 WcmeBW?qy~(=H=xQ)!4|^&IkY)R|5I~ diff --git a/blog/__pycache__/models.cpython-36.pyc b/blog/__pycache__/models.cpython-36.pyc index 2d3d54d0eb3b4d9cc32257ced986c259079be094..71f207d0923ea18219612f8c950bcd18357d9802 100644 GIT binary patch literal 1780 zcma)7OK%%D5MHkKrPWIED^C<{+M)-cfDN?QqKIKTY0=sVZ27_qvl3}}m3_G6Dv68U zoKu1Pkp3lJd&<41p8CzMY^y*TbPW!NGedef-#65^{eJvSc{;Cr$NAG)`8?>4F-!>| z9m#U1V4N}1-P|oYywm8N+$((U7Xc5NwU>uQ#3SZBb)+wYw~h=Hn|H4|JccEd5iHTt z(u1WdV_4#)C6T=oXOz6h|8z#o21O-RZlFa*)pb_R%*eItPgSXOHhofQmCeeZ)TJFR zO~)!v>#QoVqqkR;wJPiJ<%OEkdDmYD%3}=k2tqlWNr$_tGxsEu?mNbP*^%B`hX>L} zE`jZg)7g88SR5J`=^K%&a#o*D8BFxiOk)qj1Q5SDa|b)w5jOa*(tM$yct+)Ce>gfp zz~5i*oL7a~nN~8Zc3xNdrMXC_YG;zC<*dR~&34+GZ(m&6PzY0NA$oMa3*oR|d&p^f zX+Ii;HWH#t3nhe&g}~NDPI@B5FN-v9J({-K?pVF4pJXbRI>uTLNKj5IqEE{ZBEm34 zgoq_>WBFGhZz%EtA*+Q{{yacIL&@H`Jc8D}a(GN7R=pd00<91GKn{g`!GgPf?GHr1dHGqa=GFQ`DWO9tKBwf^%D67{Z zl@jaddVMt7(nDme*GR0BXv!1ca!M0V>~QyV{DU|>IXD)F&-M>~MiRRxd%ODwJe+Ek z)|J*96c;YD&_n=zhfG_~E0fjPEA=CII8(Z<`d#u<<@n$_@it}K-%o2b&I;88+PFDi zNs-pJ2S~HCtXZr8)!^2kwTS}>N<$)I8!TdL7%@wjCf|o~`yHN-<3`8;0m7~e-GfdD zlI{X0mp3TNK!)%P;28o@!m%%-#>w)+-lzu8Es)bundsq5ZgjfxYxpB$^%p)QWijKfAQf z>Kt9FsmE3d+|-sz`X$D7?4=Cl`xJo|*F&VPcg23c_|z^2My>gJ+=f&@74~)tCAcat{yF@^V~}Y}rL!YrQ(1 z8I1?sX|T7^wCx-7-`)N>f~nYs=t=xZ@HfCf=VJ_57wHvYtQy delta 567 zcmZ`$!DU7cTDM-ji@na_*1(G|eC8`S8P|H%C7yA?I$5F4Y@^ z5J3beGJ_Hz^iLIjg=#6Cx5j7%&zGW;*Y#o#q5l1o$}1$aK|gj5E* z#7JwK_P~6-_yVcZ@E8(z20Ql$cvFu8r2oP&j0_>hGNDNzqnf!@dK*5uU(xX$F%sDc zDaRs5(*@6VJ7du+?b-@$rIpUpm0Jb%@t&&Ncb>I#rF76MKy&wvJ& z+}9EbQPs8_VIs}j=FgD5pYN&09QKo541&w3-W}In#>kodf^@(&!sH!-R%DyhWERIB2#XK*i zm2n1Xc{)>mcUK3&K0f77JU|Nw(*m76!^kGI66=<*UW6G?c36v9;3gik@phQYyrp@e zvo`A5w;CcJkzb<@q7HhkEeYz^SJFl;ZKAXW>&ZsqCY#9?+hW^G9lg5$>s9u~64~s@ zQjbWm&7NYP&!u~E*Oc^UJg*?Hszm{%e6h2$^NI?{_!ZEVg(?%x!wjT3O?f1Jbb3kS zJg(v}mG%M8G7KQ~m`#qPemw4*(huhqr!xUz1x&UJ5oe)T&`VfIw*-OT#Wx`RD-cs& zu7caEeA4C91ZEYDneT9dXF0%JQ9#x zm**52g$krzacS4txIl|p_iJJJl$ED_U0BGju<=0bDC{cSl@6^(L#gyA#fs)BAoeN! zHV;!3gi>LktL&E7VNrxrv@<9mXOPbpLRY5s(fQ;(JwH4ALQg)84?jx(-Xlg*+6VO< zPt@`Wwd~S=8%HCY@R2G{x)bs>@1S;M literal 0 HcmV?d00001 diff --git a/blog/migrations/__pycache__/__init__.cpython-36.pyc b/blog/migrations/__pycache__/__init__.cpython-36.pyc index ed5999760e2832ee9afd333735a9437700810f15..4213f95633c0a919dbcfc21e62bdd7a397abd67e 100644 GIT binary patch delta 14 VcmeBX>}F&$=H=xw&Y8&83IG;812F&q delta 14 VcmeBX>}F&$=H=xQ)tJcE3IG(B0?z;d diff --git a/blog/models.py b/blog/models.py index 9aa2ea3ea8..b4a3758e5b 100644 --- a/blog/models.py +++ b/blog/models.py @@ -1,6 +1,9 @@ from django.db import models from django.conf import settings +from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation +from django.contrib.contenttypes.models import ContentType + # Create your models here. class Tag(models.Model): value = models.TextField(max_length=100) @@ -8,6 +11,15 @@ class Tag(models.Model): def __str__(self): return self.value +class Comment(models.Model): + creator = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) + content = models.TextField() + content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) + object_id = models.PositiveIntegerField() + content_object = GenericForeignKey("content_type", "object_id") + created_at = models.DateTimeField(auto_now_add=True) + modified_at = models.DateTimeField(auto_now=True) + class Post(models.Model): author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT) created_at = models.DateTimeField(auto_now_add=True) @@ -18,6 +30,8 @@ class Post(models.Model): summary = models.TextField(max_length=500) content = models.TextField() tags = models.ManyToManyField(Tag, related_name="posts") + comments = GenericRelation(Comment) def __str__(self): return self.title + diff --git a/db.sqlite3 b/db.sqlite3 index 29405ee0ee1c4e4fe32ca6c0751311ba0f3d623e..3bde9cda445413691332cc0e154cacf40fa02e5d 100644 GIT binary patch delta 1129 zcmZ{iO-$2Z7{~i;9bG%dyTRs^kx;r$oiOM&8Dc~%12rm42#F^d`zUiVRzem(4u(~u z2fav!X<}l$n0Te^u!~>65_ds zcb!%*hG9+WQ(C=KO#!~21m7Ly#u`6F?0Y)r^x{hUAO<=VWy0PPPP=6r|!t<9~RFX(G6)H_FQ zz~=9?oCGrerlqmQMyawSieP9Ny+ZHMQxqv!xL#zn;C3fy%Il(Je!O#f7m0>2^bNg5 zFVPe95Zy-Ckcfs9sT)}liDPzWSw&t9-_x_^zC3Z3H=6I5FPWp}K1KRd8Lq~`4dkVi zaJkenYs0|iNaSUDnPJGvaBK?Nqd<1=d$tmd|X;e*9mtjefKIn^cJm_@A{t+mo^enX~6AQo_O{Yu@ z^^;muq+8S^!x}Jfd$)`nie_ld0(#xxy)KpU`2O=iqt;y6;FvXTt1TM0mML*`gUY!Y zHK!aUt29d8mylxmJxo8E&Eb|>6TxCgGOtv=u8f(!n*7vbs@`~-m?2n2svwR?Bu_Yc z-5_~WnS^jf`^qKFNPI$wX2pp}DiJv}(%#nA9`~1@H_1yesF_@!ayy!#!+kVUUc=D) znN3;7Bkev$IL@ip^V?i6X0qx}AIV-F7qlJ(e{h83f`M|q#*q9a2GyHQ>`=2qCtGR8 zbEChLaJb!YOUOoJX`%e4@^?>Ypobsqp$GY{GdyC}r7>M#s_w1eh6vXX#qd9Dj;<<1b;WF-w9hE>;PE(8PMDT>3eWB{rF Ipa0hX0}<|1ZU6uP delta 274 zcmZo@;BIK(njkHx$-uy%0mLxiHBrY{Sd&3dW&`y{NJ5w7SAOunM8Eh)?eRKdYtz`*~G|1|$C{=NJK{B`^b z_`5eYM(|HAu%9Br!Jp5-|CawI|0(`G{PX#{_-py|H#UazPtNzB%B;XUcQSi`0AknG6Jj@S=^ZAnKm(*F*Y%LXULz}XuVy27Slu4?Ez_wTQZpyxO1knUtk0p NtHQlK=QiV%B>+d8PNx6> From 83d54176e2128d877cb2c2a842f1356ce711bac4 Mon Sep 17 00:00:00 2001 From: Alberto Olmos Date: Wed, 15 Jul 2026 01:26:20 +0000 Subject: [PATCH 3/6] Finish html frameworks --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 2498 -> 2515 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 904 -> 962 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 531 -> 531 bytes blango/settings.py | 4 +++- blango/urls.py | 2 ++ blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 532 -> 518 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 1780 -> 1780 bytes blog/__pycache__/views.cpython-36.pyc | Bin 0 -> 299 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 1135 -> 1135 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes blog/views.py | 2 ++ templates/base.html | 15 +++++++++++++++ templates/blog/index.html | 6 ++++++ 17 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 blog/__pycache__/views.cpython-36.pyc create mode 100644 templates/base.html create mode 100644 templates/blog/index.html diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index 1b628dcbace391e2014b7e70dadb6ef95d881d0c..d32983f58a896899a05ec9d107bd4e6e2140bfa5 100644 GIT binary patch delta 14 VcmZo-Y+__H=H=yLub#+O0{|4N0{H*{ delta 14 VcmZo-Y+__H=H=xw&Y8$o0{|6D0~P=P diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index 829b5707f19e42cc63c4baf9002279bc32952c11..965cb193a125db20e2fba6904caae71d921422f9 100644 GIT binary patch delta 209 zcmX>kd|6o8n3tE!yEZgShL3^aF#{6d0J0r`xR__6^4$7V_7o{;hIGah))eU!nH1R+ zxfJ#O3{guPGOCb0b*GomP^r%l26f#Qb=J6X3*46)MjL0;Bv`I%uC;F$vBaj l`4(r%=0hyOjEvly#n}Ebv1tRHSEM~zlCz$XWAaQ+O#lW5F1G*x delta 205 zcmcaCd`MW?n3tE!I43lVg^z*ZF#{6d0J0r`xR`CC^4$7#h7{HmsTAoHnH1R+xpbCH z#uWKEEa{9+`}OV3v*PAw_f?8?~9 iy!keZHzOn0W_7l|Ol(>}rxj^U*5a&ZWSYE+QxgDWtuBZF diff --git a/blango/__pycache__/urls.cpython-36.pyc b/blango/__pycache__/urls.cpython-36.pyc index 1d98f5dac07c7d17b618ea053fe35a15969fbb2d..dcebfa4726e31f313fd6a18c5cf0560c17db6259 100644 GIT binary patch delta 240 zcmeBRKg3>d%*)HAP#2md%gn&=m;ni}0ND;eT&#Y~~#1 zT$U&nFq_Y|W=dy@;!a@+X3%6$%x7X?NXkjf zOV3vb4f0WN&d=MJUCzYoSH+f?lAD>Qe~UqrXYyMn1E(miq@4V8y|T>I^5R=8AoeYm z;>?oNTP&qTImNeFArh>ac`2zCx43~~1&JjksYQ9kD;bJ-f$lBhoovr+&&LI1vM}-h JAqO)LBLH7 delta 163 zcmX@a-oYMW%*)GVoD-V$hKYgUF#{4{2C^N1xYz(lq%cG=q%fv1S*%%X%}nWxQS2$K!3>&g8*{ptxU1L_Q*tx&^!+qBCNnb|DBWTy w&MZm2#Zp?7Q+$gXNERfPl%y8r6|ZC{;sjb##5uW?*`A9H$Yf#UVdP;305bg}3IG5A diff --git a/blango/__pycache__/wsgi.cpython-36.pyc b/blango/__pycache__/wsgi.cpython-36.pyc index 6785a36a8ee13e607b8690707d1fa798bd1462d7..eb1ef99617a2bc9a34ddf7110c65b99107490c68 100644 GIT binary patch delta 15 WcmbQtGMR delta 14 VcmZo*Y+z(F=H=xw&Y8$o1ppNk0}ucJ diff --git a/blog/__pycache__/admin.cpython-36.pyc b/blog/__pycache__/admin.cpython-36.pyc index 3c60291025463724d95e722b685e2c65e78aa944..758296966147fca6851ce37ce16c707a4b771ca1 100644 GIT binary patch delta 356 zcmYjNu}T9$6nyXY?cL?br7(f~f(I6gl@LU+urdm2v)BaQ5)y86aF+GvDxV8!$ZOcv*Ht4tziI`3H3N@B~&CT;YmbeQn2zJ?uP5wgi$ZyI zGnsn2s+y%w&MN2ZV*NZE4a8-^AcKh*nPzAdD=E;v6TGJ(?WrkOQ?Hk^WogF+)@kUb z_19774eDG(oo_C2e;5l5k8C1=6zibJMYegxy?(7l`0S!$TmH1x@#Y=-2iv?1e_1cs Y(vhopRoY|uLTEC9E)Jp{>S7PS0n~&@?*IS* literal 532 zcmYjOv2NTj43#YT&bc^g(JYy|yTf_N8Wic&r9BjAyJ!(~N7d0)KDm;OBJ<^E`b%0f z9YJ5(zv10 z|5qTmLQCi9EK?kqDu6@jxDqf^5+usa^ARyWkye(;PhBoYH+q}vVOo2at}SRYt{NWa zsM8d2h9Opj%Uo%_GriS1FSPChOrCJ9^`FW3=gQd-?GT2^n-QgcIqM5x^<*usAFO;aZKw|6qt#`!>!$Da}{leGufCIU#a78k%QjLa8KwBk*dq5 SbwA?Ivqa~p`CCyJ@8l!0Sc9Da diff --git a/blog/__pycache__/apps.cpython-36.pyc b/blog/__pycache__/apps.cpython-36.pyc index 323987db89d6d01dcdff6e773ff3f68f21e68b0c..0b0dcc0862f63c0179169e87ee8481c1193248db 100644 GIT binary patch delta 15 WcmeBW?qy~(=H=yLuinVk&IkY*q60qw delta 15 WcmeBW?qy~(=H=xw&e_P;&IkY+UjtkK diff --git a/blog/__pycache__/models.cpython-36.pyc b/blog/__pycache__/models.cpython-36.pyc index 71f207d0923ea18219612f8c950bcd18357d9802..0df47758cf974b73fb2fd9564b047a3e977659e5 100644 GIT binary patch delta 26 hcmeyu`-PX+n3tD}y*e~2pOt~(@ni!g(Tz%%*Z^iH2ZR6s delta 26 hcmeyu`-PX+n3tE!C@(ZCpOt~(@ni!g(Tz%%*Z^oU2ciG~ diff --git a/blog/__pycache__/views.cpython-36.pyc b/blog/__pycache__/views.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e026a66c5d75d8692d35459462782872315d4197 GIT binary patch literal 299 zcmYjMu};G<6nu7?7FAR*@(W>z2UdiT*t;N>Y;B&^q;=|II}{K|NbocKQdTB@fu)>1 zAf9yhY`=GR^2Ka6J-ptn--zf7_$!IiHQ>)cOe_p_q7s5wa`r)$n*ZGlg(55JnTH?|bdTC%F+`e$G{6 zJFRNVtyO#LHh#CLwOX3Rc4g6E^U&(OFLzHvo(!YRM>i5~44xNRb;|3wU;4(nQ1`*7 ZxHL{N|0suKIJ)dC_eNjEe=zOzL23X1 literal 0 HcmV?d00001 diff --git a/blog/migrations/__pycache__/0001_initial.cpython-36.pyc b/blog/migrations/__pycache__/0001_initial.cpython-36.pyc index 6bb11ec8075e1d3b16279b4944c4a674e50c12a0..97deeccadfbddf137c055db4312542e1069b93dc 100644 GIT binary patch delta 15 WcmX@ld7hKan3tD}y?P_tNfrPh{R9*M delta 15 WcmX@ld7hKan3tE!IA}F&$=H=yLub#-(3IG+I0~7!N delta 14 VcmeBX>}F&$=H=xw&Y8&83IG;812F&q diff --git a/blog/views.py b/blog/views.py index 91ea44a218..7851fbf836 100644 --- a/blog/views.py +++ b/blog/views.py @@ -1,3 +1,5 @@ from django.shortcuts import render # Create your views here. +def index(request): + return render(request, "blog/index.html") \ No newline at end of file diff --git a/templates/base.html b/templates/base.html new file mode 100644 index 0000000000..2c6ed3737f --- /dev/null +++ b/templates/base.html @@ -0,0 +1,15 @@ + + + + + + + Hello, world! + + + {% block content %} + + {% endblock %} + + + \ No newline at end of file diff --git a/templates/blog/index.html b/templates/blog/index.html new file mode 100644 index 0000000000..f3118f1ea1 --- /dev/null +++ b/templates/blog/index.html @@ -0,0 +1,6 @@ +{% extends "base.html" %} +{% block content %} +
+

Hello in a Container

+
+{% endblock %} \ No newline at end of file From 7021fbc56370ebf0f6c95ddedbd4a9d95e6bb3cb Mon Sep 17 00:00:00 2001 From: Alberto Olmos Date: Wed, 15 Jul 2026 02:20:49 +0000 Subject: [PATCH 4/6] working with filters django template --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 2515 -> 2515 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 962 -> 962 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 531 -> 531 bytes blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 518 -> 518 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 1780 -> 1780 bytes blog/__pycache__/views.cpython-36.pyc | Bin 299 -> 475 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 1135 -> 1135 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes blog/templatetags/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 141 bytes .../__pycache__/blog_extras.cpython-36.pyc | Bin 0 -> 654 bytes blog/templatetags/blog_extras.py | 26 ++++++++++++++++++ blog/views.py | 5 +++- db.sqlite3 | Bin 180224 -> 180224 bytes templates/blog/index.html | 18 ++++++++++-- 19 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 blog/templatetags/__init__.py create mode 100644 blog/templatetags/__pycache__/__init__.cpython-36.pyc create mode 100644 blog/templatetags/__pycache__/blog_extras.cpython-36.pyc create mode 100644 blog/templatetags/blog_extras.py diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index d32983f58a896899a05ec9d107bd4e6e2140bfa5..cd5352275a566ae59da7597dc395dddfac3aae0e 100644 GIT binary patch delta 15 WcmZo-Y+__L=H=x&`z&lCdo=(auLOYr delta 15 WcmZo-Y+__L=H=yLuMVBaUJU>j@B>c( diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index 965cb193a125db20e2fba6904caae71d921422f9..0029d55222ffdc9661c52ed46534d6e6920f58ac 100644 GIT binary patch delta 16 XcmcaCd|8;?n3tF9?6a_q>}NOuFVO|T delta 16 XcmcaCd|8;?n3tE!yEb$q`x#CEDaZuX diff --git a/blango/__pycache__/urls.cpython-36.pyc b/blango/__pycache__/urls.cpython-36.pyc index dcebfa4726e31f313fd6a18c5cf0560c17db6259..0a9c42cbfd6e83cf4130cce46502bc9df4408bb3 100644 GIT binary patch delta 16 XcmX@aeu$mjn3tF9?6a_q?7Nu(EL#O| delta 16 XcmX@aeu$mjn3tDJp)PbI`)+0cB`XA4 diff --git a/blango/__pycache__/wsgi.cpython-36.pyc b/blango/__pycache__/wsgi.cpython-36.pyc index eb1ef99617a2bc9a34ddf7110c65b99107490c68..fd827eac375531496d1e202b2a20ed0443059a40 100644 GIT binary patch delta 16 XcmbQtGMR^w{WB_;%1 delta 16 XcmbQtGMRjre8NRVg|LZV+GAyK$lZDO-=aN=M)EUchfS`NSwxRP56 z#1*I*M-*#oW`2!l<{SBJHXDC@-_}PMp)a&^0??OW<`f)53`^8tim}&$3>reopot8d zh(@487QG=Fv-k$3$q#g)6uVgSmT?VgWJSX_s^y@=Yh`Q+$l-WY1a<{xj=@<}<2taU z4z~b)$FJB%FMws_1q-|-00`$PrUzYLNMS0@7E8NWNXs{Sg;c9t0P`uUY$ILN0m`JY z4q>oMR8jNN8W-OQDA$_!ENRtR`z_MIC7M6<+*s{5`b2sR;rAr3RKxR9F`@Fc()XrY zmOL-yvRx?%fP55uZL;p!MFTvBHsg^9A7VX)I8PJ0&uZV1nM!F}_SOtkH~mldR!B3f lL??b|)+ojyz2UdiT*t;N>Y;B&^q;=|II}{K|NbocKQdTB@fu)>1 zAf9yhY`=GR^2Ka6J-ptn--zf7_$!IiHQ>)cOe_p_q7s5wa`r)$n*ZGlg(55JnTH?|bdTC%F+`e$G{6 zJFRNVtyO#LHh#CLwOX3Rc4g6E^U&(OFLzHvo(!YRM>i5~44xNRb;|3wU;4(nQ1`*7 ZxHL{N|0suKIJ)dC_eNjEe=zOzL23X1 diff --git a/blog/migrations/__pycache__/0001_initial.cpython-36.pyc b/blog/migrations/__pycache__/0001_initial.cpython-36.pyc index 97deeccadfbddf137c055db4312542e1069b93dc..2ca29f2c602f59500dc8d3d9a2785577192c24d3 100644 GIT binary patch delta 16 XcmX@ld7hKqn3tF9?6a_q>?c?NE;I$4 delta 16 XcmX@ld7hKqn3tD}y*hLw`w12RCPM^j diff --git a/blog/migrations/__pycache__/0002_comment.cpython-36.pyc b/blog/migrations/__pycache__/0002_comment.cpython-36.pyc index be6a31d2bb0a0aa1353b2a56a8f4ae04173f2a3d..f41d7b041242a95a6634cddd20c7bb08ec85a97a 100644 GIT binary patch delta 16 XcmaFQ@t%X-n3tF9?6a_q>=`ToF&G7U delta 16 XcmaFQ@t%X-n3tD}y*hLwdj<;tDJKL- diff --git a/blog/migrations/__pycache__/__init__.cpython-36.pyc b/blog/migrations/__pycache__/__init__.cpython-36.pyc index 4bc7783b1937badaa9b3fdb3701e9b8de4a71e4c..c5e7abac09c706d5939ceaef1012b7900f93bc74 100644 GIT binary patch delta 15 WcmeBX>}F&)=H=x&`z&lCdkX*`v;>?0 delta 15 WcmeBX>}F&)=H=yLuMVBa-U0v^^#f`E diff --git a/blog/templatetags/__init__.py b/blog/templatetags/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/blog/templatetags/__pycache__/__init__.cpython-36.pyc b/blog/templatetags/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ec5ea84a4024f0f2e44eae9a0b743b616e11b4f GIT binary patch literal 141 zcmXr!<>ktK5thXO1dl-k3@`#24nSPY0whuxf*CX!{Z=v*frJsnFDw0w{M=Oi=#N<@{q@2XO^n4(dpRQk$np=>QSdv8nu5av-7t*DNX{tO+1Y+9_LOHnvRfUZTB6dk+>v`EWR^<$7Uni$sPE`0_g z574LRdvNVkpihvgM+HGc;J!P3yyJJ|>D}pR{Oj+R>IWs{H+i-KjIYqldjv@&)TDt0 z08voU16c&f(V8{kB1A4khO3|&$w0F2}d z(@9n5;B#<=XkPXsnyC>i*%J!~Y9a`4hCOQ|2^c}o_E@(EG_1J~e5==vJiz(xY$ndvTCFZG8d27^`>>-I^BtR| zVxDjpm!@ou6>Y9u{QnLvUX|L|tQC!NC$)GABcC#mq4LKiq2pp}*PV9E)A|Ko)A0@J zmA8(Y?F#)*qR)_ixJ=hwqtd*SWtV>I^jEVHxk{I{Xp0VASENs`YDHlNCR4Xo3p3r^ zxyhqYCY42HGxD$c7J<;1GCGDgG@=|hjDb@IjOtgocb%L#E-SB~@s}WO^r>8Gq3>Lz zRZ$wNw0r%yKh3+=>T)^tI@%9Tdkx1|_-slK#|;;G1}}X=G{d=XYc=' + suffix = "" + else: + prefix = "" + suffix = "" + + return f"{prefix}{name}{suffix}" diff --git a/blog/views.py b/blog/views.py index 7851fbf836..5d6d3ca745 100644 --- a/blog/views.py +++ b/blog/views.py @@ -1,5 +1,8 @@ from django.shortcuts import render +from django.utils import timezone +from blog.models import Post # Create your views here. def index(request): - return render(request, "blog/index.html") \ No newline at end of file + posts = Post.objects.filter(published_at__lte=timezone.now()) + return render(request, "blog/index.html", {"posts": posts}) \ No newline at end of file diff --git a/db.sqlite3 b/db.sqlite3 index 3bde9cda445413691332cc0e154cacf40fa02e5d..9311cc71f61fa82462d6af5c64bff804e21321c6 100644 GIT binary patch delta 1109 zcmah|&2Jk;9G#inO|yx-KL-?oR9X)POEomk?mFu@mMUt8uh4`*0}^UgCF|X3ys-8< z-gT=`Rf*xig#*Y!xdk{O!J#ri-9MncS4fBhZPlu|v{KR%K8gfLFzcvM2}qn)GxL6L z-h1*rT?S-SpWEm39NVK!-VhyOm$j1w5LWM#X@_2WDra3Gb83BJqX1VA%V-T zw=h@t{D7?A89AVevj}FxfjD^u;29i4ts_}^Xeceq+5K(PGvfwT^@64rM)RIq_57Lk zcV22=(Jiw^;C)>eX)lRgM9S6J#ZK$X*rE55M4EnowiqlLwWj%QZs{G>*2y z6{l|Hm~B;a<+kwYH)u28?P_DG^ZNc zu_`NBGnTIExnXr|SRdb&l*t=-+*H;&tq+yuqmqn@ka`x&@&o1CPMAE;Y(`f#byU-zf7`4rc=R|kt>EOj zq-opCP8R67^XE_XnqtH-w1j26he0c-`HY@3#b%%)ODT5tYm0NVKIxS{Sb){REv`>MX@L@Vgo zhr_bF!3{T};9mC5(!irOJHuSBPS3LPGWDH+`BPqlRjE_=n^kIiuGfgRDUTvJOf9eG zGb><0vq4SUsXM;q)D|dnoghPBYnaSuwScmK@_(ht8jRYGSSSAt?k&KCm`A6;A)+Yn5DKupQ`Kz_ f+kgX6jfoJIl?cK=Alq=i3z4EjA-um#`i}k$-EuaV delta 415 zcmW-cze`(D6vywm_Zq#4$u}y|K_yZsG_)E`e8vbxV+I$8x@M`?p-bTfTDtbV$yIqn zHo?_Jo)64F;4X?oAz2y<{umPRM+7VAd0ozd@AsVZ{T#=MIZkYQlqPq^$~5V(*VC$j zRo~6QTg?uU^wzT}Qr^$(#$c}yqCcV1=F2zx>*uQd{YP+>9iP@~0&Bjzf~5O_;==t{ zG9&SfF{QY-X>SbXCuWKZ`P_n4n95tTh53T*o!f7Fr*g$Pt7sio^+bdc4UuU0?r9=u z>}DuJXbLogf$AB8=E1w0s6t2JA0E(Q@egX914^-YEAWg*+_Lx=V_F$fVUbE16K7b3 zvcNI6Q1)F5v1MgM37Pj~OwCQpRDJV=_Bb6affnERje6^a-XvM62vmIc6Ka*T-0zdP z6L`X1FyLHZq(^GOA)2_ED8~@m0`310wf3SM=KW_T -

Hello in a Container

- +

Blog Posts

+ {% for post in posts %} +
+
+

{{ post.title }}

+ By {{post.author|author_details }} on {{ post.published_at|date:"M, d Y" }} +

{{ post.summary }}

+

+ ({{ post.content|wordcount }} words) + Read More +

+
+
+ {% endfor %} {% endblock %} \ No newline at end of file From 0b37228afafe9574108b5597ff0871b0b2148451 Mon Sep 17 00:00:00 2001 From: Luis Alberto Olmos Gonzalez <125162436+olmos-dev@users.noreply.github.com> Date: Tue, 14 Jul 2026 20:28:01 -0600 Subject: [PATCH 5/6] update safe change --- templates/blog/index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/blog/index.html b/templates/blog/index.html index d214ad2fcf..0da6d041ce 100644 --- a/templates/blog/index.html +++ b/templates/blog/index.html @@ -6,7 +6,7 @@

Blog Posts

{{ post.title }}

- By {{post.author|author_details }} on {{ post.published_at|date:"M, d Y" }} + By {{post.author|author_details|safe }} on {{ post.published_at|date:"M, d Y" }}

{{ post.summary }}

({{ post.content|wordcount }} words) @@ -15,4 +15,4 @@

{{ post.title }}

{% endfor %} -{% endblock %} \ No newline at end of file +{% endblock %} From cc9d3a3d26e0f4fccc49a9d8b493679962236d2d Mon Sep 17 00:00:00 2001 From: Alberto Olmos Date: Wed, 15 Jul 2026 03:04:09 +0000 Subject: [PATCH 6/6] Finish custom filters --- .../__pycache__/blog_extras.cpython-36.pyc | Bin 654 -> 857 bytes blog/templatetags/blog_extras.py | 19 +++++++++++------- db.sqlite3 | Bin 180224 -> 180224 bytes templates/blog/index.html | 2 +- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc b/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc index 45b5dd37e73036beb98892d614fa0dffd2720d30..1ed2c135607d21276c44a8479cdbcae87454ae18 100644 GIT binary patch literal 857 zcmY*Xy>8nu5GE;!k`>2jkrV|w6hSsG*3hkRi~?PYECD)bs6dOfEJu_Kl13B9TB^Q< z(Ff=&aqZM6D3GZ~*+Ekhy!-BWJl@~C)6@9s&*#-Q520V^+42E@fTOtv_l4WM2|SW0ldSvM7=eHldhLno|^5@%I~SSN8EGL9{uoIQb&M;J!%PX zs^;*@cc>$+2RP_(>(>#-tp~>k4c&P=vhzD1vJ0;*+MZ3dQB7UUq?jg0_=qpI=TmmE zRAO;;DOp*W=KVu^IotZvgw3|}p>=y4+PKtZtqrSlVdH`9>*GAL?lR-iWRtit^4J{9M@%4CQU-FgvWwJ5wbmH2pTzBp3|MYG~prB=4D41bn>ETwn0k&sH z)4Zv{WIl1>C^s61(uJSOxnk8nu5av-7t*DNX{tO+1Y+9_LOHnvRfUZTB6dk+>v`EWR^<$7Uni$sPE`0_g z574LRdvNVkpihvgM+HGc;J!P3yyJJ|>D}pR{Oj+R>IWs{H+i-KjIYqldjv@&)TDt0 z08voU16c&f(V8{kB1A4khO3|&$w0F2}d z(@9n5;B#<=XkPXsnyC>i*%J!~Y9a`4hCOQ|2^c}o_E@(EG_1J~e5==vJiz(xY$ndvTCFZG8d27^`>>-I^BtR| zVxDjpm!@ou6>Y9u{QnLvUX|L|tQC!NC$)GABcC#mq4LKiq2pp}*PV9E)A|Ko)A0@J zmA8(Y?F#)*qR)_ixJ=hwqtd*SWtV>I^jEVHxk{I{Xp0VASENs`YDHlNCR4Xo3p3r^ zxyhqYCY42HGxD$c7J<;1GCGDgG@=|hjDb@IjOtgocb%L#E-SB~@s}WO^r>8Gq3>Lz zRZ$wNw0r%yKh3+=>T)^tI@%9Tdkx1|_-slK#|;;G1}}X=G{d=XYc=me") + if author.first_name and author.last_name: name = f"{author.first_name} {author.last_name}" else: name = f"{author.username}" if author.email: - email = author.email - prefix = f'' - suffix = "" + prefix = format_html('', author.email) + suffix = format_html("") else: prefix = "" suffix = "" - return f"{prefix}{name}{suffix}" + return format_html('{}{}{}', prefix, name, suffix) diff --git a/db.sqlite3 b/db.sqlite3 index 9311cc71f61fa82462d6af5c64bff804e21321c6..909b90f221245167ae1af316239d98a5e0b519a3 100644 GIT binary patch delta 375 zcmZo@;BIK(o*>O=Hc`fz(QIRas6Hd-<}&@8_KaJa1M;^A!&A|VX|1SS^ z{)_ylw{tCE+{rJ&%FM{f!U-lhz$81EWSjnYJ)@!+C;t@&{y+TR`9JZ$<$uBdnExLC zP5vvJ1q*iZORz9=GID|l4iLc(BG^F0Z+i=fV4lcMh-H z#zq}p)eufj21kDJct%b}BLgEdT?2DnLsJC delta 117 zcmV-*0E+*BfD3?t3y>QDGLalZ0Wz^*6)yn=vvx1pKao%bgHvy}Q*QyWFb)L|;{Xro z5Bm@G5AP4-vk`F750~Sw0U-_r59k07{15jJ@(=9~=(7=U)(->(0|^0>?B5s;1rDA7 X55y0L4?_;%4xX`rj1IS+&H-ZaYuhT! diff --git a/templates/blog/index.html b/templates/blog/index.html index 0da6d041ce..a2b286db54 100644 --- a/templates/blog/index.html +++ b/templates/blog/index.html @@ -6,7 +6,7 @@

Blog Posts

{{ post.title }}

- By {{post.author|author_details|safe }} on {{ post.published_at|date:"M, d Y" }} + By {{ post.author|author_details:request.user }} on {{ post.published_at|date:"M, d Y" }}

{{ post.summary }}

({{ post.content|wordcount }} words)