diff --git a/blog/__pycache__/feeds.cpython-311.pyc b/blog/__pycache__/feeds.cpython-311.pyc
new file mode 100644
index 0000000..288dc84
Binary files /dev/null and b/blog/__pycache__/feeds.cpython-311.pyc differ
diff --git a/blog/__pycache__/forms.cpython-311.pyc b/blog/__pycache__/forms.cpython-311.pyc
new file mode 100644
index 0000000..a8c54b9
Binary files /dev/null and b/blog/__pycache__/forms.cpython-311.pyc differ
diff --git a/blog/__pycache__/sitemaps.cpython-311.pyc b/blog/__pycache__/sitemaps.cpython-311.pyc
new file mode 100644
index 0000000..a1de354
Binary files /dev/null and b/blog/__pycache__/sitemaps.cpython-311.pyc differ
diff --git a/blog/feeds.py b/blog/feeds.py
new file mode 100644
index 0000000..7818ca7
--- /dev/null
+++ b/blog/feeds.py
@@ -0,0 +1,23 @@
+import markdown
+from django.contrib.syndication.views import Feed
+from django.template.defaultfilters import truncatewords_html
+from django.urls import reverse_lazy
+from .models import Post
+
+
+class LatestPostFeed(Feed):
+ title = 'My blog'
+ link = reverse_lazy('blog:post_list')
+ description = 'New posts of my blog.'
+
+ def items(self):
+ return Post.published.all()[:5]
+
+ def item_title(self, item):
+ return item.title
+
+ def item_description(self, item):
+ return truncatewords_html(markdown.markdown(item.body), 30)
+
+ def item_pubdate(self, item):
+ return item.publish
diff --git a/blog/forms.py b/blog/forms.py
new file mode 100644
index 0000000..1188962
--- /dev/null
+++ b/blog/forms.py
@@ -0,0 +1,20 @@
+from django import forms
+from .models import Comment
+
+
+class EmailPostForm(forms.Form):
+ name = forms.CharField(max_length=25)
+ email = forms.EmailField()
+ to = forms.EmailField()
+ comments = forms.CharField(required=False,
+ widget=forms.Textarea)
+
+
+class CommentForm(forms.ModelForm):
+ class Meta:
+ model = Comment
+ fields = ['name', 'email', 'body']
+
+
+class SearchForm(forms.Form):
+ query = forms.CharField()
diff --git a/blog/migrations/0003_comment_comment_blog_commen_created_0e6ed4_idx.py b/blog/migrations/0003_comment_comment_blog_commen_created_0e6ed4_idx.py
new file mode 100644
index 0000000..4e78b7e
--- /dev/null
+++ b/blog/migrations/0003_comment_comment_blog_commen_created_0e6ed4_idx.py
@@ -0,0 +1,34 @@
+# Generated by Django 4.2 on 2023-05-22 16:57
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('blog', '0002_alter_post_slug'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Comment',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=80)),
+ ('email', models.EmailField(max_length=254)),
+ ('body', models.TextField()),
+ ('created', models.DateTimeField(auto_now_add=True)),
+ ('updated', models.DateTimeField(auto_now=True)),
+ ('active', models.BooleanField(default=True)),
+ ('post', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='comments', to='blog.post')),
+ ],
+ options={
+ 'ordering': ['created'],
+ },
+ ),
+ migrations.AddIndex(
+ model_name='comment',
+ index=models.Index(fields=['created'], name='blog_commen_created_0e6ed4_idx'),
+ ),
+ ]
diff --git a/blog/migrations/0004_post_tags.py b/blog/migrations/0004_post_tags.py
new file mode 100644
index 0000000..ec6ee4f
--- /dev/null
+++ b/blog/migrations/0004_post_tags.py
@@ -0,0 +1,20 @@
+# Generated by Django 4.2 on 2023-05-24 16:42
+
+from django.db import migrations
+import taggit.managers
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('taggit', '0005_auto_20220424_2025'),
+ ('blog', '0003_comment_comment_blog_commen_created_0e6ed4_idx'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='post',
+ 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/blog/migrations/__pycache__/0003_comment_comment_blog_commen_created_0e6ed4_idx.cpython-311.pyc b/blog/migrations/__pycache__/0003_comment_comment_blog_commen_created_0e6ed4_idx.cpython-311.pyc
new file mode 100644
index 0000000..81d449b
Binary files /dev/null and b/blog/migrations/__pycache__/0003_comment_comment_blog_commen_created_0e6ed4_idx.cpython-311.pyc differ
diff --git a/blog/migrations/__pycache__/0004_post_tags.cpython-311.pyc b/blog/migrations/__pycache__/0004_post_tags.cpython-311.pyc
new file mode 100644
index 0000000..2e42fa1
Binary files /dev/null and b/blog/migrations/__pycache__/0004_post_tags.cpython-311.pyc differ
diff --git a/blog/sitemaps.py b/blog/sitemaps.py
new file mode 100644
index 0000000..c4bb6b5
--- /dev/null
+++ b/blog/sitemaps.py
@@ -0,0 +1,13 @@
+from django.contrib.sitemaps import Sitemap
+from .models import Post
+
+
+class PostSitemap(Sitemap):
+ changefreq = 'weekly'
+ priority = 0.9
+
+ def items(self):
+ return Post.published.all()
+
+ def lastmod(self, obj):
+ return obj.updated
diff --git a/blog/templates/blog/post/comment.html b/blog/templates/blog/post/comment.html
new file mode 100644
index 0000000..29bef16
--- /dev/null
+++ b/blog/templates/blog/post/comment.html
@@ -0,0 +1,11 @@
+{% extends 'blog/base.html' %}
+{% block title %}Add a comment {% endblock title %}
+
+{% block content %}
+{% if comment %}
+
Your comment has been added.
+Back to the post
+{% else %}
+{% include 'blog/post/includes/comment_form.html' %}
+{% endif %}
+{% endblock content %}
\ No newline at end of file
diff --git a/blog/templates/blog/post/includes/comment_form.html b/blog/templates/blog/post/includes/comment_form.html
new file mode 100644
index 0000000..35a105c
--- /dev/null
+++ b/blog/templates/blog/post/includes/comment_form.html
@@ -0,0 +1,6 @@
+Add a new comment
+
\ No newline at end of file
diff --git a/blog/templates/blog/post/latest_posts.html b/blog/templates/blog/post/latest_posts.html
new file mode 100644
index 0000000..3be24f2
--- /dev/null
+++ b/blog/templates/blog/post/latest_posts.html
@@ -0,0 +1,7 @@
+
+ {% for post in latest_posts %}
+ -
+ {{post.title}}
+
+ {% endfor %}
+
\ No newline at end of file
diff --git a/blog/templates/blog/post/search.html b/blog/templates/blog/post/search.html
new file mode 100644
index 0000000..db09915
--- /dev/null
+++ b/blog/templates/blog/post/search.html
@@ -0,0 +1,32 @@
+{% extends "blog/base.html" %}
+{% load blog_tags %}
+
+{% block title %}Search{% endblock %}
+
+{% block content %}
+ {% if query %}
+ Posts containing "{{ query }}"
+
+ {% with results.count as total_results %}
+ Found {{ total_results }} result{{ total_results|pluralize }}
+ {% endwith %}
+
+ {% for post in results %}
+
+ {{ post.body|markdown|truncatewords_html:12 }}
+ {% empty %}
+ There are no results for your query.
+ {% endfor %}
+ Search again
+ {% else %}
+ Search for posts
+
+ {% endif %}
+{% endblock %}
\ No newline at end of file
diff --git a/blog/templates/blog/post/share.html b/blog/templates/blog/post/share.html
new file mode 100644
index 0000000..186c94e
--- /dev/null
+++ b/blog/templates/blog/post/share.html
@@ -0,0 +1,17 @@
+{% extends 'blog/base.html' %}
+{% block title %} Share a post {% endblock title %}
+{% block content %}
+{% if sent %}
+E-mail successfully sent
+
+ {{post.title}} was successfully sent to {{form.cleaned_data.to}}.
+
+{% else %}
+share {{post.title}} by e-mail
+
+{% endif %}
+{% endblock content %}
\ No newline at end of file
diff --git a/blog/templatetags/__init__.py b/blog/templatetags/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/blog/templatetags/__pycache__/__init__.cpython-311.pyc b/blog/templatetags/__pycache__/__init__.cpython-311.pyc
new file mode 100644
index 0000000..b47c60f
Binary files /dev/null and b/blog/templatetags/__pycache__/__init__.cpython-311.pyc differ
diff --git a/blog/templatetags/__pycache__/blog_tags.cpython-311.pyc b/blog/templatetags/__pycache__/blog_tags.cpython-311.pyc
new file mode 100644
index 0000000..93c391e
Binary files /dev/null and b/blog/templatetags/__pycache__/blog_tags.cpython-311.pyc differ
diff --git a/blog/templatetags/blog_tags.py b/blog/templatetags/blog_tags.py
new file mode 100644
index 0000000..dcf64f1
--- /dev/null
+++ b/blog/templatetags/blog_tags.py
@@ -0,0 +1,31 @@
+from django import template
+from ..models import Post
+from django.db.models import Count, Q
+from django.utils.safestring import mark_safe
+import markdown
+
+register = template.Library()
+
+
+@register.simple_tag
+def total_posts():
+ return Post.published.count()
+
+
+@register.inclusion_tag('blog/post/latest_posts.html')
+def show_latest_posts(count=5):
+ latest_posts = Post.published.order_by('-publish')[:count]
+ return {'latest_posts': latest_posts}
+
+
+@register.simple_tag
+def get_most_commented_posts(count=5):
+ return Post.published.annotate(
+ total_comments=Count('comments')
+
+ ).order_by('-total_comments')[:count]
+
+
+@register.filter(name='markdown')
+def markdown_format(text):
+ return mark_safe(markdown.markdown(text))
diff --git a/db.sqlite3 b/db.sqlite3
index bb6682b..cc576d7 100644
Binary files a/db.sqlite3 and b/db.sqlite3 differ
diff --git a/mysite/__pycache__/settings.cpython-311.pyc b/mysite/__pycache__/settings.cpython-311.pyc
index 2e351b5..cbbe067 100644
Binary files a/mysite/__pycache__/settings.cpython-311.pyc and b/mysite/__pycache__/settings.cpython-311.pyc differ
diff --git a/mysite/__pycache__/urls.cpython-311.pyc b/mysite/__pycache__/urls.cpython-311.pyc
index 81aefd9..e1b5bf7 100644
Binary files a/mysite/__pycache__/urls.cpython-311.pyc and b/mysite/__pycache__/urls.cpython-311.pyc differ
diff --git a/mysite/settings.py b/mysite/settings.py
index fee457b..3f4664b 100644
--- a/mysite/settings.py
+++ b/mysite/settings.py
@@ -29,7 +29,7 @@
# Application definition
-
+SITE_ID = 1
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
@@ -38,6 +38,9 @@
'django.contrib.messages',
'django.contrib.staticfiles',
'blog.apps.BlogConfig',
+ 'taggit',
+ 'django.contrib.sites',
+ 'django.contrib.sitemaps',
]
MIDDLEWARE = [
@@ -76,8 +79,10 @@
DATABASES = {
'default': {
- 'ENGINE': 'django.db.backends.sqlite3',
- 'NAME': BASE_DIR / 'db.sqlite3',
+ 'ENGINE': 'django.db.backends.postgresql',
+ 'NAME': 'dbnew',
+ 'USER': 'postgres',
+ 'PASSWORD': 'Admin@123',
}
}
@@ -121,7 +126,14 @@
# Default primary key field type
# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field
-# DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
+DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
# STATICFILES_DIRS = [
# BASE_DIR / "static",
# ]
+EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
+
+EMAIL_HOST = 'smtp.gmail.com'
+EMAIL_HOST_USER = 'imamitsinghchauhan@gmail.com'
+EMAIL_HOST_PASSWORD = 'vbhgqsemhweiuqcx'
+EMAIL_PORT = 587
+EMAIL_USE_TLS = True
diff --git a/mysite/urls.py b/mysite/urls.py
index 4da8ec1..da6fd7e 100644
--- a/mysite/urls.py
+++ b/mysite/urls.py
@@ -1,8 +1,15 @@
from django.contrib import admin
from django.urls import path, include
+from django.contrib.sitemaps.views import sitemap
+from blog.sitemaps import PostSitemap
+sitemaps = {
+ 'posts': PostSitemap,
+}
urlpatterns = [
path('admin/', admin.site.urls),
- path('blog/', include('blog.urls', namespace='blog')),
+ path('', include('blog.urls', namespace='blog')),
+ path('sitemap.xml', sitemap, {'sitemaps': sitemaps},
+ name='django.contrib.sitemaps.views.sitemap')
]