" 1 61))))) "") (3 (((min-height . 4) (min-width . 10) (min-height-ignore . 3) (min-width-ignore . 4) (min-height-safe . 1) (min-width-safe . 2) (min-pixel-height . 80) (min-pixel-width . 90) (min-pixel-height-ignore . 60) (min-pixel-width-ignore . 36) (min-pixel-height-safe . 20) (min-pixel-width-safe . 18)) leaf (pixel-width . 2043) (pixel-height . 1080) (total-width . 227) (total-height . 54) (normal-height . 1.0) (normal-width . 1.0) (buffer "20210616121338-django.org" (selected . t) (hscroll . 0) (fringes 0 0 nil nil) (margins 1 . 1) (scroll-bars nil 0 t nil 0 t nil) (vscroll . 0) (dedicated) (point . 6700) (start . 1))) "") (4 (((min-height . 4) (min-width . 10) (min-height-ignore . 3) (min-width-ignore . 4) (min-height-safe . 1) (min-width-safe . 2) (min-pixel-height . 80) (min-pixel-width . 90) (min-pixel-height-ignore . 60) (min-pixel-width-ignore . 36) (min-pixel-height-safe . 20) (min-pixel-width-safe . 18)) leaf (pixel-width . 2043) (pixel-height . 1080) (total-width . 227) (total-height . 54) (normal-height . 1.0) (normal-width . 1.0) (buffer "gui-config.org" (selected . t) (hscroll . 0) (fringes 0 0 nil nil) (margins 1 . 1) (scroll-bars nil 0 t nil 0 t nil) (vscroll . 0) (dedicated) (point . 39115) (start . 11896)) (prev-buffers ("20210331101333-теги_для_hugo.org" 1 1) ("*scratch*" 1 1) ("gui-config.org" 12662 49814))) ""))
\ No newline at end of file
diff --git a/blog/comments/migrations/0001_initial.py b/blog/comments/migrations/0001_initial.py
new file mode 100644
index 0000000..568a138
--- /dev/null
+++ b/blog/comments/migrations/0001_initial.py
@@ -0,0 +1,36 @@
+# Generated by Django 4.0.3 on 2022-04-09 12:38
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ('posts', '0003_alter_post_options'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='CommentAuthor',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('author_name', models.CharField(max_length=60, verbose_name='Имя автора')),
+ ('author_secret_hash', models.CharField(max_length=256, verbose_name='Хеш секрета')),
+ ],
+ ),
+ migrations.CreateModel(
+ name='Comment',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('author_name', models.CharField(max_length=60, verbose_name='имя автора')),
+ ('author_secret', models.CharField(blank=True, max_length=128, verbose_name='секретная строка')),
+ ('reply', models.IntegerField(blank=True)),
+ ('comment_text', models.TextField()),
+ ('date', models.DateTimeField()),
+ ('post', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='posts.post')),
+ ],
+ ),
+ ]
diff --git a/blog/comments/migrations/0002_alter_comment_reply.py b/blog/comments/migrations/0002_alter_comment_reply.py
new file mode 100644
index 0000000..cc7f019
--- /dev/null
+++ b/blog/comments/migrations/0002_alter_comment_reply.py
@@ -0,0 +1,18 @@
+# Generated by Django 4.0.3 on 2022-04-09 13:01
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('comments', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='comment',
+ name='reply',
+ field=models.IntegerField(null=True),
+ ),
+ ]
diff --git a/blog/comments/migrations/__init__.py b/blog/comments/migrations/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/blog/comments/models.py b/blog/comments/models.py
new file mode 100644
index 0000000..a0cfacd
--- /dev/null
+++ b/blog/comments/models.py
@@ -0,0 +1,26 @@
+from django.db import models
+from posts.models import Post
+
+
+class Comment(models.Model):
+ """Класс для комента."""
+
+ post = models.ForeignKey(Post, on_delete=models.CASCADE)
+ author_name = models.CharField("имя автора", max_length=60)
+ author_secret = models.CharField("секретная строка", max_length=128, blank=True)
+ reply = models.IntegerField(null=True)
+ comment_text = models.TextField()
+ date = models.DateTimeField()
+
+
+class CommentAuthor(models.Model):
+ """Валидация автора коммента.
+
+ Если коментатор оставил секретную фразу, то от нее вычисляется
+ хеш, который сравнивается с тем, который есть в базе для этого
+ сочетания author_name:hash.
+
+ """
+
+ author_name = models.CharField("Имя автора", max_length=60)
+ author_secret_hash = models.CharField("Хеш секрета", max_length=256)
diff --git a/blog/comments/tests.py b/blog/comments/tests.py
new file mode 100644
index 0000000..7ce503c
--- /dev/null
+++ b/blog/comments/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/blog/comments/views.py b/blog/comments/views.py
new file mode 100644
index 0000000..91ea44a
--- /dev/null
+++ b/blog/comments/views.py
@@ -0,0 +1,3 @@
+from django.shortcuts import render
+
+# Create your views here.
diff --git a/blog/posts/admin.py b/blog/posts/admin.py
index 0bef769..81dc7d8 100644
--- a/blog/posts/admin.py
+++ b/blog/posts/admin.py
@@ -5,4 +5,7 @@ from .models import Post
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
- fields = ("title", "text", "pub_date")
+ fieldsets = (
+ ("Основное", {"classes": ("wide",), "fields": ("title", "text")}),
+ ("Дополнительно", {"classes": ("collapse",), "fields": ("pub_date",)}),
+ )
diff --git a/blog/posts/templates/posts/post.html b/blog/posts/templates/posts/post.html
index ab042b8..beb537d 100644
--- a/blog/posts/templates/posts/post.html
+++ b/blog/posts/templates/posts/post.html
@@ -17,6 +17,14 @@
Опубликован: {{ post.pub_date | date:'Y-m-d, H:i' }}
{{ post.text }}
+
+ Комменты
+ {% for comment in comments %}
+ {{ comment.author_name }}
+ {{ comment.comment_text }}
+
+ {% endfor %}
+
{% endautoescape %}
diff --git a/blog/posts/views.py b/blog/posts/views.py
index 6e79911..de993e5 100644
--- a/blog/posts/views.py
+++ b/blog/posts/views.py
@@ -2,6 +2,7 @@ from django.shortcuts import render, get_object_or_404
from django.http import HttpResponse
from .models import Post
+from comments.models import Comment
import re
@@ -16,5 +17,5 @@ def detail(request, post_id):
"""Страница с просмотром поста."""
# вынести отсюда все. Также надо обработать текст поста тут.
post = get_object_or_404(Post, pk=post_id)
-
- return render(request, "posts/post.html", {"post": post})
+ comments = post.comment_set.all()
+ return render(request, "posts/post.html", {"post": post, "comments": comments})