From 2c4f16ce606a169f7aad6a36eacbb54e95f930cc Mon Sep 17 00:00:00 2001 From: root Date: Wed, 8 Oct 2025 21:30:45 +0300 Subject: [PATCH] feat: article creation --- .../migrations/0002_alter_article_title.py | 18 ++++++++++++ articles/models.py | 2 +- articles/static/index.css | 14 +++++++++ articles/templates/archive.html | 5 ++++ articles/templates/article_invalid_name.html | 21 ++++++++++++++ articles/templates/new_article.html | 27 ++++++++++++++++++ articles/views.py | 22 ++++++++++++-- blog/urls.py | 1 + db.sqlite3 | Bin 159744 -> 188416 bytes delete.sql | 1 + 10 files changed, 108 insertions(+), 3 deletions(-) create mode 100644 articles/migrations/0002_alter_article_title.py create mode 100644 articles/templates/article_invalid_name.html create mode 100644 articles/templates/new_article.html create mode 100644 delete.sql diff --git a/articles/migrations/0002_alter_article_title.py b/articles/migrations/0002_alter_article_title.py new file mode 100644 index 0000000..c232bc5 --- /dev/null +++ b/articles/migrations/0002_alter_article_title.py @@ -0,0 +1,18 @@ +# Generated by Django 5.2.6 on 2025-10-08 17:49 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('articles', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='article', + name='title', + field=models.CharField(max_length=200, unique=True), + ), + ] diff --git a/articles/models.py b/articles/models.py index 76dffc5..b69d2e5 100644 --- a/articles/models.py +++ b/articles/models.py @@ -2,7 +2,7 @@ from django.db import models from django.contrib.auth.models import User class Article(models.Model): - title = models.CharField(max_length=200) + title = models.CharField(max_length=200, unique=True) author = models.ForeignKey(User, on_delete=models.CASCADE) text = models.TextField() created_date = models.DateField(auto_now_add=True) diff --git a/articles/static/index.css b/articles/static/index.css index d670d2a..e33614a 100644 --- a/articles/static/index.css +++ b/articles/static/index.css @@ -56,4 +56,18 @@ a { .article-header { margin: 0; +} + +form { + display: flex; + flex-direction: column; + gap: 20px +} + +.submit { + margin: auto; +} + +.text { + min-height: 500px; } \ No newline at end of file diff --git a/articles/templates/archive.html b/articles/templates/archive.html index a0f0a02..c82e5bd 100644 --- a/articles/templates/archive.html +++ b/articles/templates/archive.html @@ -13,6 +13,11 @@

Всё про IT

+ {% block write %} + {% if not user.is_anonymous %} + Написать статью + {% endif %} + {% endblock %}
{% for post in posts %} diff --git a/articles/templates/article_invalid_name.html b/articles/templates/article_invalid_name.html new file mode 100644 index 0000000..2621811 --- /dev/null +++ b/articles/templates/article_invalid_name.html @@ -0,0 +1,21 @@ + + + + + + Новая статья + {% load static %} + + + + +
+ +

Всё про IT

+
+
+

Название сатьи должно быть уникально!

+
+

← Назад к редакированию статьи

+ + \ No newline at end of file diff --git a/articles/templates/new_article.html b/articles/templates/new_article.html new file mode 100644 index 0000000..c701554 --- /dev/null +++ b/articles/templates/new_article.html @@ -0,0 +1,27 @@ + + + + + + Новая статья + {% load static %} + + + + +
+ +

Всё про IT

+
+
+

Написать статью

+
{% csrf_token %} + + + +
+ {{ form.errors }} +
+

← Назад к списку статей

+ + \ No newline at end of file diff --git a/articles/views.py b/articles/views.py index 99eb4ac..2eabd47 100644 --- a/articles/views.py +++ b/articles/views.py @@ -1,6 +1,7 @@ from .models import Article from django.shortcuts import render -from django.http import Http404 +from django.http import Http404, HttpResponse +from django.shortcuts import redirect def archive(request): return render(request, 'archive.html', {"posts": Article.objects.all()}) @@ -8,6 +9,23 @@ def archive(request): def get_article(request, article_id): try: post = Article.objects.get(id=article_id) - return render(request, 'article.html', {"post": post}) + return render(request, 'article.html', {"post": post, "user": request.user}) except Article.DoesNotExist: raise Http404 + +def create_post(request): + if request.method == "POST": + form = { + 'text': request.POST["text"], 'title': request.POST["title"] + } + if form["text"] and form["title"]: + try: + article = Article.objects.create(text=form["text"], title=form["title"], author=request.user) + return redirect('get_article', article_id=article.id) + except: + return render(request, 'article_invalid_name.html') + + if not request.user.is_anonymous: + return render(request, 'new_article.html') + else: + return HttpResponse('Unauthorized', status=401) diff --git a/blog/urls.py b/blog/urls.py index 431f1a5..3c47136 100644 --- a/blog/urls.py +++ b/blog/urls.py @@ -22,4 +22,5 @@ urlpatterns = [ path('admin/', admin.site.urls), path('', views.archive), re_path(r'^article/(?P\d+)$', views.get_article, name='get_article'), + path('article/new/', views.create_post), ] diff --git a/db.sqlite3 b/db.sqlite3 index a53e5b940be88760a057983d96c846ecf5f8333e..eda65f29b574bbcc18ad6feeec99d6b0273a1f2b 100644 GIT binary patch delta 1168 zcmZuxO>7%Q6rP!#U1!(3o;bL%kk!P_4~?7HUOTpvSZ$qcnv^=J(}V;ik&tatLw+o~ zI6sXLkus`4HCpP`9CVCdC5I$^SuzD78Qbbs4Ydk9JQOY|d2i#vF5 z@Tit4F3wKpvJ0xJhEkc_Vz!uiBBd5*7jxN=8jARWs!#292fJe7o>-^qS9^Lo!{M^a z^(RIoP@+zPNgB9x&AFWjI1k925AH9!zgYeDa$p@gZm5EaCjgl!+tb6u(h3zo(Qgic#vt4=-T-Ro^1L%YGJVWTYHmRGFbDn9|hjp%g4ypx7L z3A67%bov`d>!ZezJd8t+@md}}FT^8)^Esc9nubqzJTZ9RiB#~v-gsXRg)L5>4_g8*@xg}`aOQ0}MI=OjhSh6S}*d{TJK;z3@tVE=%!%sUUX7c z*fa>Q18EMgm*^@s8e@nTE_qp=XwJmYWxo1f>&2&V4S08$$*0Y97`5}27IxAI@%)zP z5$DZl7QKb5y<6XoD>cA~v)qVza1QP9)iHK@(RnE76}j2`LPOKI>VMDKe2%Alt)}Ll|l3fR~@RWvA&DB*cR#F+?tsz(qqmXrj}o7bi1cX5RbW`@T0LE4q;_ zE^0Q36h#$~^KYGq6+3~bc;^tEt~1BAsRat&;}d4{4@SYIC|+U9%+S#SXblYb+WZ|s z&)-X0JY*XM>5oK>$apB^QE(GV!CAmS;WB63+n41Q&-S{nwsw_X3RIk}4+lanXO&|p zoY&bo&=#t$I%n^$DQ|BMhKKAI+*d+wch9xvP?N8rzxGUHFd%i6OG9-h9iqb}h?3xt za_siwF0!S>$39z*g4d0S%?BkQVd`H;iOq$>iy&2Iy&zj}TsKO8W~1w3cualf1p?1d z6kV_2Y8v4KPHkp`0I=liZSM%nq90gI|Id~y=lX%0zft7SW(oqh$;mJMARk!d9Y1K4 z-}V5rEcJj1SjZ>97A>mGEYQ>vEANr~`4`C2v%~;{c9S*^srr7njf8v?c@!84Ql-k~+pDuLuR1alF?&>WzXpr>h$TZ+OlsKG~PtQJmg znS@PhbP8r@_z4=MP}qFG)gnKggy&WE9(=6P8@LDs>3xdc=d%^OL+c{x453||t|8U4 z3(%_$&ch;>{0=o8!% 18 \ No newline at end of file