From 70d63988635c6df495deb4be52b32d16fcd4af54 Mon Sep 17 00:00:00 2001 From: Nathan Chapman Date: Tue, 19 Jul 2022 15:42:10 -0600 Subject: [PATCH] Add basic forum functions --- src/core/models.py | 10 +++++-- .../core/comment_confirm_delete.html | 13 +++++++++ .../templates/core/comment_create_form.html | 12 ++++++++ src/core/templates/core/comment_detail.html | 12 ++++++++ src/core/templates/core/comment_form.html | 13 +++++++++ src/core/templates/core/comment_list.html | 19 +++++++++++++ src/core/templates/core/post_create_form.html | 4 +-- src/core/templates/core/post_detail.html | 28 +++++++++++++++++-- src/core/templates/core/topic_detail.html | 9 ++++++ src/core/templates/core/topic_list.html | 25 ++++++++++------- src/core/urls.py | 6 ++-- src/core/views.py | 22 +++++++++++++++ 12 files changed, 154 insertions(+), 19 deletions(-) create mode 100644 src/core/templates/core/comment_confirm_delete.html create mode 100644 src/core/templates/core/comment_create_form.html create mode 100644 src/core/templates/core/comment_detail.html create mode 100644 src/core/templates/core/comment_form.html create mode 100644 src/core/templates/core/comment_list.html diff --git a/src/core/models.py b/src/core/models.py index 49f9185..05dc210 100644 --- a/src/core/models.py +++ b/src/core/models.py @@ -19,8 +19,11 @@ class Topic(models.Model): """ name = models.CharField(max_length=255) + def __str__(self): + return self.name + def get_absolute_url(self): - return reverse('core:tag-detail', kwargs={'pk': self.pk}) + return reverse('core:tag-detail', kwargs={'topic_pk': self.pk}) class Tag(models.Model): @@ -118,7 +121,10 @@ class Post(models.Model): objects = PostManager() def get_absolute_url(self): - return reverse('core:post-detail', kwargs={'pk': self.pk}) + return reverse('core:post-detail', kwargs={ + 'topic_pk': self.topic.pk, + 'post_pk': self.pk + }) class Meta: ordering = ['-pub_date'] diff --git a/src/core/templates/core/comment_confirm_delete.html b/src/core/templates/core/comment_confirm_delete.html new file mode 100644 index 0000000..694d7e0 --- /dev/null +++ b/src/core/templates/core/comment_confirm_delete.html @@ -0,0 +1,13 @@ +{% extends 'base.html' %} + +{% block content %} +

Delete comments

+
+ {% csrf_token %} +

Are you sure you want to delete "{{ comments }}"?

+ {{ form.as_p }} +

+ or cancel +

+
+{% endblock %} diff --git a/src/core/templates/core/comment_create_form.html b/src/core/templates/core/comment_create_form.html new file mode 100644 index 0000000..bc428c7 --- /dev/null +++ b/src/core/templates/core/comment_create_form.html @@ -0,0 +1,12 @@ +{% extends 'base.html' %} + +{% block content %} +

+ New comments

+
+ {% csrf_token %} + {{ form.as_p }} +

+ or cancel +

+
+{% endblock %} diff --git a/src/core/templates/core/comment_detail.html b/src/core/templates/core/comment_detail.html new file mode 100644 index 0000000..48e01e2 --- /dev/null +++ b/src/core/templates/core/comment_detail.html @@ -0,0 +1,12 @@ +{% load helpers %} + +
+
+ {{ comment.author }}
+ +
+
+ {{ comment.content|markdown|safe }} +
+
+
diff --git a/src/core/templates/core/comment_form.html b/src/core/templates/core/comment_form.html new file mode 100644 index 0000000..b4698c1 --- /dev/null +++ b/src/core/templates/core/comment_form.html @@ -0,0 +1,13 @@ +{% extends 'base.html' %} + +{% block content %} +

Update comment

+

Delete

+
+ {% csrf_token %} + {{ form.as_p }} +

+ or cancel +

+
+{% endblock %} diff --git a/src/core/templates/core/comment_list.html b/src/core/templates/core/comment_list.html new file mode 100644 index 0000000..e72ea16 --- /dev/null +++ b/src/core/templates/core/comment_list.html @@ -0,0 +1,19 @@ +{% extends 'base.html' %} + +{% block content %} +

Comments

+

+ + New comment +

+ + + {% for comment in comments_list %} + +
{{ comment }}
+ + {% empty %} + No comments yet. + {% endfor %} + +
+{% endblock %} diff --git a/src/core/templates/core/post_create_form.html b/src/core/templates/core/post_create_form.html index 6097592..bb33cbb 100644 --- a/src/core/templates/core/post_create_form.html +++ b/src/core/templates/core/post_create_form.html @@ -2,11 +2,11 @@ {% block content %}

+ New Post

-
+ {% csrf_token %} {{ form.as_p }}

- or cancel + or cancel

{% endblock %} diff --git a/src/core/templates/core/post_detail.html b/src/core/templates/core/post_detail.html index 9aff092..4a0f36b 100644 --- a/src/core/templates/core/post_detail.html +++ b/src/core/templates/core/post_detail.html @@ -1,6 +1,11 @@ {% extends 'base.html' %} +{% load static %} {% load helpers %} +{% block head %} + +{% endblock head %} + {% block content %}
@@ -9,12 +14,31 @@

{{ post.title }}

- Edit - Delete + Edit + Delete

{{ post.content|markdown|safe }}
+
+

Discussion

+ +
+ {% for comment in post.comments.all %} + {% include 'core/comment_detail.html' with comment=comment %} +
+ {% endfor %} +
+ +
+

Add a comment

+
+ {% csrf_token %} + {{ comment_create_form.as_p }} + +
+
+
{% endblock %} diff --git a/src/core/templates/core/topic_detail.html b/src/core/templates/core/topic_detail.html index 20a6fee..3337b7d 100644 --- a/src/core/templates/core/topic_detail.html +++ b/src/core/templates/core/topic_detail.html @@ -7,4 +7,13 @@ Delete

{{ topic }}

+ +
+ + New post + {% for post in topic.post_list.all %} +

{{ post.title }}

+ {% empty %} +

No posts

+ {% endfor %} +
{% endblock %} diff --git a/src/core/templates/core/topic_list.html b/src/core/templates/core/topic_list.html index fb969bc..c8cf46d 100644 --- a/src/core/templates/core/topic_list.html +++ b/src/core/templates/core/topic_list.html @@ -1,17 +1,22 @@ {% extends 'base.html' %} {% block content %} -

Topics

-+ New topic - - +
+

Topics

+ + New topic +
{% for topic in topic_list %} -
-
{{ topic }}
- +

{{ topic.name }}

+ {% empty %} - No topics yet. +

No topics yet.

{% endfor %} - -
+ + {% endblock %} diff --git a/src/core/urls.py b/src/core/urls.py index 9353b88..f6258a9 100644 --- a/src/core/urls.py +++ b/src/core/urls.py @@ -42,11 +42,11 @@ urlpatterns = [ name='topic-list' ), path( - 'new/', + 'topics/new/', views.TopicCreateView.as_view(), name='topic-create' ), - path('/', include([ + path('topics//', include([ path( '', views.TopicDetailView.as_view(), @@ -75,7 +75,7 @@ urlpatterns = [ views.PostCreateView.as_view(), name='post-create' ), - path('/', include([ + path('/', include([ path( '', views.PostDetailView.as_view(), diff --git a/src/core/views.py b/src/core/views.py index 1b8a442..5a8da52 100644 --- a/src/core/views.py +++ b/src/core/views.py @@ -9,6 +9,7 @@ from django.views.generic.edit import ( from django.contrib import messages from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.messages.views import SuccessMessageMixin +from django.contrib.contenttypes.models import ContentType from .models import Topic, Post, Comment from .forms import PostForm, CommentCreateForm @@ -60,16 +61,19 @@ class TopicCreateView(SuccessMessageMixin, CreateView): class TopicDetailView(DetailView): model = Topic + pk_url_kwarg = 'topic_pk' class TopicUpdateView(SuccessMessageMixin, UpdateView): model = Topic + pk_url_kwarg = 'topic_pk' success_message = 'Topic saved.' fields = '__all__' class TopicDeleteView(SuccessMessageMixin, DeleteView): model = Topic + pk_url_kwarg = 'topic_pk' success_message = 'Topic deleted.' success_url = reverse_lazy('topic-list') @@ -84,18 +88,36 @@ class PostCreateView(SuccessMessageMixin, CreateView): template_name_suffix = '_create_form' fields = '__all__' + def get_context_data(self, *args, **kwargs): + context = super().get_context_data(*args, **kwargs) + context['topic'] = get_object_or_404(Topic, pk=self.kwargs['topic_pk']) + return context + class PostDetailView(DetailView): model = Post + pk_url_kwarg = 'post_pk' + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + object_content_type = ContentType.objects.get_for_model(self.object).pk + + context['comment_create_form'] = CommentCreateForm(initial={ + 'content_type': object_content_type, + 'object_id': self.object.pk + }) + return context class PostUpdateView(SuccessMessageMixin, UpdateView): model = Post + pk_url_kwarg = 'post_pk' success_message = 'Post saved.' fields = '__all__' class PostDeleteView(SuccessMessageMixin, DeleteView): model = Post + pk_url_kwarg = 'post_pk' success_message = 'Post deleted.' success_url = reverse_lazy('article-list')