From 2b9b04091ad7dc02ad4d568095aa4273e15b6dcb Mon Sep 17 00:00:00 2001 From: ms01732 <mansoor.saleem@stud.th-deg.de> Date: Fri, 28 Jun 2019 23:47:33 +0200 Subject: [PATCH] modifiy and upto date comment section --- myproject1/articles/forms.py | 3 +- .../articles/migrations/0001_initial.py | 21 ++++++++- .../articles/migrations/0002_article_thumb.py | 18 -------- .../migrations/0003_article_author.py | 21 --------- .../articles/migrations/0004_comment.py | 26 ----------- .../migrations/0005_auto_20190602_2247.py | 23 ---------- .../migrations/0006_auto_20190603_0134.py | 18 -------- .../migrations/0007_auto_20190603_0240.py | 18 -------- .../articles/migrations/0008_article_tags.py | 20 -------- myproject1/articles/models.py | 16 +++++-- .../templates/articles/article_detail.html | 43 +++++++----------- .../templates/articles/article_list.html | 2 +- myproject1/articles/views.py | 27 +++++++++-- myproject1/db.sqlite3 | Bin 208896 -> 196608 bytes 14 files changed, 71 insertions(+), 185 deletions(-) delete mode 100644 myproject1/articles/migrations/0002_article_thumb.py delete mode 100644 myproject1/articles/migrations/0003_article_author.py delete mode 100644 myproject1/articles/migrations/0004_comment.py delete mode 100644 myproject1/articles/migrations/0005_auto_20190602_2247.py delete mode 100644 myproject1/articles/migrations/0006_auto_20190603_0134.py delete mode 100644 myproject1/articles/migrations/0007_auto_20190603_0240.py delete mode 100644 myproject1/articles/migrations/0008_article_tags.py diff --git a/myproject1/articles/forms.py b/myproject1/articles/forms.py index 3d30b16..0bc0e1b 100644 --- a/myproject1/articles/forms.py +++ b/myproject1/articles/forms.py @@ -15,8 +15,7 @@ class ArticleEditForm(forms.ModelForm): fields = ['title', 'body', 'slug', 'thumb','tags'] - class CommentForm(forms.ModelForm): class Meta: model = Comment - fields = ('content',) \ No newline at end of file + fields = ('text',) \ No newline at end of file diff --git a/myproject1/articles/migrations/0001_initial.py b/myproject1/articles/migrations/0001_initial.py index f00b5f1..70fa4af 100644 --- a/myproject1/articles/migrations/0001_initial.py +++ b/myproject1/articles/migrations/0001_initial.py @@ -1,6 +1,10 @@ -# Generated by Django 2.2 on 2019-05-19 12:29 +# Generated by Django 2.2 on 2019-06-28 21:36 +from django.conf import settings from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone +import taggit.managers class Migration(migrations.Migration): @@ -8,6 +12,8 @@ class Migration(migrations.Migration): initial = True dependencies = [ + ('taggit', '0003_taggeditem_add_unique_index'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ @@ -19,6 +25,19 @@ class Migration(migrations.Migration): ('slug', models.SlugField()), ('body', models.TextField()), ('date', models.DateTimeField(auto_now_add=True)), + ('thumb', models.ImageField(blank=True, default='default.png', upload_to='')), + ('author', models.ForeignKey(default=None, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), + ('tags', taggit.managers.TaggableManager(help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags')), + ], + ), + migrations.CreateModel( + name='Comment', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('author', models.CharField(max_length=200)), + ('text', models.TextField()), + ('created_date', models.DateTimeField(default=django.utils.timezone.now)), + ('post', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='comments', to='articles.Article')), ], ), ] diff --git a/myproject1/articles/migrations/0002_article_thumb.py b/myproject1/articles/migrations/0002_article_thumb.py deleted file mode 100644 index fab11d0..0000000 --- a/myproject1/articles/migrations/0002_article_thumb.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 2.2 on 2019-06-02 10:59 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('articles', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='article', - name='thumb', - field=models.ImageField(blank=True, default='default.png', upload_to=''), - ), - ] diff --git a/myproject1/articles/migrations/0003_article_author.py b/myproject1/articles/migrations/0003_article_author.py deleted file mode 100644 index 7b983d3..0000000 --- a/myproject1/articles/migrations/0003_article_author.py +++ /dev/null @@ -1,21 +0,0 @@ -# Generated by Django 2.2 on 2019-06-02 14:01 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('articles', '0002_article_thumb'), - ] - - operations = [ - migrations.AddField( - model_name='article', - name='author', - field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), - ), - ] diff --git a/myproject1/articles/migrations/0004_comment.py b/myproject1/articles/migrations/0004_comment.py deleted file mode 100644 index 48d33fc..0000000 --- a/myproject1/articles/migrations/0004_comment.py +++ /dev/null @@ -1,26 +0,0 @@ -# Generated by Django 2.2 on 2019-06-02 14:58 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('articles', '0003_article_author'), - ] - - operations = [ - migrations.CreateModel( - name='Comment', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('content', models.TextField(max_length=150)), - ('timestamp', models.DateTimeField(auto_now_add=True)), - ('article', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='articles.Article')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), - ], - ), - ] diff --git a/myproject1/articles/migrations/0005_auto_20190602_2247.py b/myproject1/articles/migrations/0005_auto_20190602_2247.py deleted file mode 100644 index da8ea25..0000000 --- a/myproject1/articles/migrations/0005_auto_20190602_2247.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 2.2 on 2019-06-02 20:47 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('articles', '0004_comment'), - ] - - operations = [ - migrations.RenameField( - model_name='comment', - old_name='timestamp', - new_name='date', - ), - migrations.RenameField( - model_name='comment', - old_name='article', - new_name='post', - ), - ] diff --git a/myproject1/articles/migrations/0006_auto_20190603_0134.py b/myproject1/articles/migrations/0006_auto_20190603_0134.py deleted file mode 100644 index 893540e..0000000 --- a/myproject1/articles/migrations/0006_auto_20190603_0134.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 2.2 on 2019-06-02 23:34 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('articles', '0005_auto_20190602_2247'), - ] - - operations = [ - migrations.RenameField( - model_name='comment', - old_name='date', - new_name='timestamp', - ), - ] diff --git a/myproject1/articles/migrations/0007_auto_20190603_0240.py b/myproject1/articles/migrations/0007_auto_20190603_0240.py deleted file mode 100644 index 1869170..0000000 --- a/myproject1/articles/migrations/0007_auto_20190603_0240.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 2.2 on 2019-06-03 00:40 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('articles', '0006_auto_20190603_0134'), - ] - - operations = [ - migrations.RenameField( - model_name='comment', - old_name='post', - new_name='article', - ), - ] diff --git a/myproject1/articles/migrations/0008_article_tags.py b/myproject1/articles/migrations/0008_article_tags.py deleted file mode 100644 index 91b36f7..0000000 --- a/myproject1/articles/migrations/0008_article_tags.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 2.2.1 on 2019-06-14 09:12 - -from django.db import migrations -import taggit.managers - - -class Migration(migrations.Migration): - - dependencies = [ - ('taggit', '0003_taggeditem_add_unique_index'), - ('articles', '0007_auto_20190603_0240'), - ] - - operations = [ - migrations.AddField( - model_name='article', - name='tags', - field=taggit.managers.TaggableManager(help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags'), - ), - ] diff --git a/myproject1/articles/models.py b/myproject1/articles/models.py index 64098bd..b804878 100644 --- a/myproject1/articles/models.py +++ b/myproject1/articles/models.py @@ -1,6 +1,7 @@ from django.db import models from django.contrib.auth.models import User from taggit.managers import TaggableManager +from django.utils import timezone # Create your models here. class Article(models.Model): @@ -22,11 +23,16 @@ class Article(models.Model): class Comment(models.Model): - article = models.ForeignKey(Article, on_delete=models.PROTECT) - user = models.ForeignKey(User, on_delete=models.PROTECT) - content = models.TextField(max_length=150) - timestamp = models.DateTimeField(auto_now_add=True) + post = models.ForeignKey(Article, on_delete=models.CASCADE, related_name='comments') + author = models.CharField(max_length=200) + text = models.TextField() + created_date = models.DateTimeField(default=timezone.now) + #approved_comment = models.BooleanField(default=False) + + #def approve(self): + #self.approved_comment = True + #self.save() def __str__(self): - return '{}.{}'.format(self.article.title, str(self.user.username)) + return '{}.{}'.format(self.post.title, str(self.author)) diff --git a/myproject1/articles/templates/articles/article_detail.html b/myproject1/articles/templates/articles/article_detail.html index 97020b7..f46ea10 100644 --- a/myproject1/articles/templates/articles/article_detail.html +++ b/myproject1/articles/templates/articles/article_detail.html @@ -5,40 +5,29 @@ <div class="article"> <img src="{{ article.thumb.url }}" /> <h2>{{ article.title }}</h2> + <h3>Written by {{ article.author.username }}</h3> <p>{{ article.body }}</p> <p>{{ article.date }}</p> - <p>{{article.tags.all|join:", "}}</p> + <p>{{ article.tags }}</p> </div> </div> -{% if article.author == request.user %} -<div class="section-1" style="float: right;"> -<a href="{% url 'articles:article_edit' id=article.id %}"> - <button type="button" class="btn btn-outline-success">Edit</button> -</a> -<a href="{% url 'articles:article_delete' id=article.id %}"> - <button type="button" class="btn btn-outline-success">Delete</button> -</a> -</div> - {% endif %} -<br><br> <hr> -<form method="article"> - {% csrf_token %} - {{ comment_form.as_p }} - <input type="submit" value = "submit" class="btn btn-outline-success"> -</form> - -<div class="main-comment-section"> - {{ comments.count }} Comment{{ comments|pluralize }} - {% for comment in comments %} - <blockquote class="blockquote"> - <p class="mb-0">{{ comments.content }}</p> - <footer class="blockquote-footer">by <cite title="Source Title">{{ comment.user|capfirst }}</cite></footer> - </blockquote> - {% endfor %} +<form method="post"> + {% csrf_token %} + {{ comment_form.as_p }} + <input type="submit" value="Submit" class="btn btn-outline.success"> -</div> +</form> +{% for comment in article.comments.all %} + <div class="comment"> + <div class="date">{{ comment.created_date }}</div> + <strong>{{ comment.author }}</strong> + <p>{{ comment.text|linebreaks }}</p> + </div> +{% empty %} + <p>No comments here yet :(</p> +{% endfor %} {% endblock %} \ No newline at end of file diff --git a/myproject1/articles/templates/articles/article_list.html b/myproject1/articles/templates/articles/article_list.html index 0270f1a..08cedf5 100644 --- a/myproject1/articles/templates/articles/article_list.html +++ b/myproject1/articles/templates/articles/article_list.html @@ -26,7 +26,7 @@ <div class="articles"> {% for article in articles %} <div class="article"> - <a href="{% url 'articles:detail' slug=article.slug %}"> + <h2><a href="{% url 'articles:detail' slug=article.slug %}">{{ article.title }}</a></h2> <h2><b><i><u>{{ article.title }}</u></i></b></h2> <p>{{ article.snippet }}</p> <p>{{ article.date }}</p> diff --git a/myproject1/articles/views.py b/myproject1/articles/views.py index 0ab2551..3097ba4 100644 --- a/myproject1/articles/views.py +++ b/myproject1/articles/views.py @@ -1,13 +1,16 @@ +from django.urls import reverse from django.http import HttpResponse, HttpResponseRedirect, Http404 from django.shortcuts import render, redirect, get_object_or_404 from taggit.models import Tag from django.views.generic import DetailView, ListView from .forms import * +from . import forms +from .forms import CreateArticle, CommentForm from .models import Article from django.contrib.auth.decorators import login_required -from . import forms + @@ -40,12 +43,26 @@ def article_list(request): return render(request, 'articles/article_list.html', { 'articles': articles }) +def article_detail(request, slug): # return HttpResponse(slug) + post = get_object_or_404(Article, slug=slug) + comments = Comment.objects.filter(post=post).order_by('.date') + if request.method == 'POST': + comment_form = CommentForm(request.POST or None) + if comment_form.is_valid(): + text = request.POST.get('text') + comment = Comment.objects.create(post=post, author=request.user.username, text=text) + comment.save() + return HttpResponseRedirect(request.path_info) + else: + comment_form = CommentForm() + context={ + 'article': post, + 'comments': comments, + 'comment_form': comment_form, + } + return render(request, 'articles/article_detail.html', context) -def article_detail(request, slug): - # return HttpResponse(slug) - article = Article.objects.get(slug=slug) - return render(request, 'articles/article_detail.html', {'article': article}) diff --git a/myproject1/db.sqlite3 b/myproject1/db.sqlite3 index 0663026b98a1dbb107902a27a2bff438f484a6f5..09747ac0b8bf0688c98ef51a8cf536f39085e370 100644 GIT binary patch delta 3297 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 literal 208896 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 -- GitLab