The goal of the project:
Equipping the existing site with more advanced features, making it more user-oriented and SEO friendly, and preparing a new version of the site by optimizing the codes in detail.
General Features of the Site:
Back-end:
- All fields on the site can be fully edited in both Turkish and English from the admin panel.
- Blog posts now have an algorithm for how long they can be read. This algorithm can calculate how long it takes to analyze images and code as well as words in the text.
- It is now possible to comment on blog posts. This way, readers can interact and exchange technical information.
- There is now a tag system for posts added to the New Blog section. In this way, similar article recommendation is randomly selected from articles with the same tag.
- Now the codes have been optimized in more detail and performance measurements have been made. Ex:
class ProjectDetailsView(DetailView):
.....
queryset = Projects.objects.select_related("project_category").prefetch_related("used_techs")
.....
def get_context_data(self, **kwargs):
.....
context['project_en'] = ProjectsEN.objects.filter(id=self.object.id).only("slug")
context['new_post_count'] = Blog.objects.filter(published_date__range=(few_days_ago, now)).only(
"published_date").count()
return context
- There is now a newsletter system to be notified of new blog posts. You can easily subscribe for the Newsletter list, and easily unsubscribe with one click.
- Images (for example, blog posts or project pictures) uploaded by the user from the admin panel in the site infrastructure are automatically produced in the desired dimensions in the new generation webp format.
class Blog(SEOAbstractModel):
status = models.BooleanField("Durum (Aktif/Pasif)", default=False)
is_sended = models.BooleanField("Newsletter Durumu", default=False)
author = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="Yazar", related_name='blog_posts', default=1)
title = models.CharField("Blog Başlığı", max_length=150, unique=True)
short_description = models.TextField("Kısa Açıklama", max_length=155)
tags = TaggableManager()
post_image = models.ImageField("Yazı Resmi", help_text="1304x500 / Zorunlu alan değildir.",
blank=True, null=True, upload_to='img/blog/')
post_thumbnail_1304x500 = ImageSpecField(source='post_image',
processors=[Transpose(), ResizeToFill(1304, 500)],
format='WEBP',
options={'quality': 80})
post_thumbnail_500x500 = ImageSpecField(source='post_image',
processors=[Transpose(), ResizeToFill(500, 500)],
format='WEBP',
options={'quality': 80})
post_thumbnail_JPG = ImageSpecField(source='post_image',
processors=[Transpose(), ResizeToFill(1200, 460)],
format='JPEG',
options={'quality': 80})
text = RichTextUploadingField("Yazı İçeriği")
updated_on = models.DateTimeField("Güncellenme Tarihi", auto_now=True)
.....
- It is now possible to send messages from the contact page.
Front-end:
- The interface is now much more integrated with Bootstrap.
- If a new blog post has been written in the last week, the interface will automatically display a notification badge in the blog menu in the top navigation.
- Social media sharing feature has been added for easy sharing of blog posts.
- All areas of the site are responsive, mobile compatible, and work without disturbing the interface.
- The website is 100% mobile compatible with PWA integration. If you wish, you can easily install the application on your phone or computer from all platforms. It is also possible to download from Play Store for Android devices.
- Language switching fully works. For example, when you open a Turkish project, if you click on the English language, the English version of the same project will open.
SEO:
- All main SEO infrastructure (title, description, keywords, canonical, twitter tags, open graph meta etc.) is dynamically created for all pages and can be managed from the admin panel.
- It has 100% search engine optimization.
- Sitemap is created automatically.
Google Performance Test Result:
And there are many more features that I forgot. :)