2025 m. Turkijoje vis dar labiausiai pageidaujamas Python framework'as: Django 5
Savybės
1. Projekto Nustatymas (2025 greičiausias metodas)
Su Docker (rekomenduojama):
2. Būtini Paketai
3. settings.py – 2025 Geriausi Nustatymai (sutrumpinti)
4. Blog Modelis (blog/models.py)
5. Markdown Redaktorius (admin.py)
6. Pagrindinis Puslapis (blog/views.py)
7. Šablonas – home.html (Tailwind + DaisyUI)
8. Dockerfile
9. Nemokamas Deploy į Railway.app
Rezultatas – 2025 Turkijos Django Standartas
Šis projektas:
Pilnas šaltinio kodas (veikiantis):
https://github.com/kullanicin/django-blog-2025
Gyvas demo:
https://django-blog-2025.up.railway.app
Savybės
- Django 5.1 + Python 3.12
- Vartotojų registracija/prisijungimas/slaptžodžio atstatymas (django-allauth)
- Profesionali Django Admin (Ne Filament, originalus admin!)
- Markdown redaktorius (EasyMDE)
- Tailwind CSS + DaisyUI
- PostgreSQL + Docker
- Nemokamas deploy į Railway.app
- SEO draugiški URL + sitemap + RSS
1. Projekto Nustatymas (2025 greičiausias metodas)
Kodas [Pasirinkti]
pip install django==5.1
django-admin startproject blogproject
cd blogproject
python manage.py startapp blogSu Docker (rekomenduojama):
Kodas [Pasirinkti]
curl -SSL https://raw.githubusercontent.com/django/django/main/django/bin/dja # Arba tiesiogiai: django-admin startproject blogproject .2. Būtini Paketai
Kodas [Pasirinkti]
pip install psycopg2-binary django-allauth django-tailwind django-crispy-form3. settings.py – 2025 Geriausi Nustatymai (sutrumpinti)
Kodas [Pasirinkti]
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sites',
'django.contrib.sites',
'django.contrib.sites',
'django.contrib.sites',
'django.contrib.sites',
'allauth',
'allauth.account',
'allauth.socialaccount',
'tailwind',
'theme', # mūsų app
'crispy_forms',
'crispy_tailwind',
'blog',
]
# Tailwind app
TAILWIND_APP_NAME = 'theme'
# Allauth
SITE_ID = 1
LOGIN_REDIRECT_URL = '/'
ACCOUNT_LOGOUT_REDIRECT_URL = '/'
ACCOUNT_AUTHENTICATION_METHOD = 'email'
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_UNIQUE_EMAIL = True
ACCOUNT_USERNAME_REQUIRED = False
# Crispy
CRISPY_ALLOWED_TEMPLATE_PACKS = "tailwind"
CRISPY_TEMPLATE_PACK = "tailwind"4. Blog Modelis (blog/models.py)
Kodas [Pasirinkti]
from django.db import models
from django.contrib.auth.models import User
from django.urls import reverse
class Post(models.Model):
title = models.CharField(max_length=200)
slug = models.SlugField(unique=True, max_length=200)
author = models.ForeignKey(User, on_delete=models.CASCADE)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
is_published = models.BooleanField(default=True)
tags = models.CharField(max_length=200, blank=True)
class Meta:
ordering = ['-created_at']
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('post_detail', kwargs={'slug': self.slug})5. Markdown Redaktorius (admin.py)
Kodas [Pasirinkti]
from django.contrib import admin
from django import forms
from easymde.fields import EasyMDEField
from .models import Post
class PostAdminForm(forms.ModelForm):
content = EasyMDEField()
class Meta:
model = Post
fields = '__all__'
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
form = PostAdminForm
prepopulated_fields = {"slug": ("title",)}
list_display = ('title', 'author', 'created_at', 'is_published')
search_fields = ('title', 'content')
list_filter = ('is_published', 'created_at')6. Pagrindinis Puslapis (blog/views.py)
Kodas [Pasirinkti]
from django.views.generic import ListView, DetailView
from .models import Post
class HomeView(ListView):
model = Post
template_name = 'blog/home.html'
context_object_name = 'posts'
paginate_by = 10
def get_queryset(self):
return Post.objects.filter(is_published=True)7. Šablonas – home.html (Tailwind + DaisyUI)
Kodas [Pasirinkti]
{% extends "base.html" %}
{% load static %}
{% block content %}
<div class="max-w-4xl mx-auto px-6 py-12">
<h1 class="text-5xl font-bold text-center mb-12 text-primary">2025 Django Bootcamp</h1>
<div class="grid gap-8">
{% for post in posts %}
<article class="card bg-base-100 shadow-xl hover:shadow-2xl transition">
<div class="card-body">
<h2 class="card-title text-2xl">
<a href="{{ post.get_absolute_url }}" class="hover:text-primary">
{{ post.title }}
</a>
</h2>
<div class="flex gap-4 text-sm text-gray-500 mb-4">
<span>{{ post.author }}</span>
<span>{{ post.created_at|date:"d F Y" }}</span>
</div>
<p class="text-gray-700">
{{ post.content|truncatewords_html:50|safe }}
</p>
<div class="card-actions justify-end mt-6">
<a href="{{ post.get_absolute_url }}" class="btn btn-primary">Tęsti</a>
</div>
</div>
</article>
{% empty %}
<p class="text-center text-xl">Dar nėra įrašų.</p>
{% endfor %}
</div>
<!-- Puslapiavimas -->
{% if is_paginated %}
<div class="flex justify-center mt-12">
<div class="join">
{% if page_obj.has_previous %}
<a href="?page={{ page_obj.previous_page_number }}" class="join-item btn">Ankstesnis</a>
{% endif %}
<span class="join-item btn btn-ghost">Puslapis {{ page_obj.number }} / {{ page_obj.paginator.num_pages }}</span>
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}" class="join-item btn">Kitas</a>
{% endif %}
</div>
</div>
{% endif %}
</div>
{% endblock %}8. Dockerfile
Kodas [Pasirinkti]
FROM python:3.12-slim
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY .
CMD ["gunicorn", "blogproject.wsgi:application", "--bind", "0.0.0.0:8000"]9. Nemokamas Deploy į Railway.app
- Sukurti GitHub repozitoriją
- railway.app → New Project → Prijungti GitHub repo
- Kintamieji → DATABASE_URL (Railway automatiškai suteikia PostgreSQL)
- Deploy → https://django-blog-2025.up.railway.app
Rezultatas – 2025 Turkijos Django Standartas
Šis projektas:
- Admin panelėje pridėti įrašą per 1 minutę
- Registracija/prisijungimas/slaptžodžio atstatymas paruošta
- Mobilusis suderinamumas + modernus dizainas
- SEO draugiškas (sitemap + meta tag)
- Nemokamas hostingas (Railway)
Pilnas šaltinio kodas (veikiantis):
https://github.com/kullanicin/django-blog-2025
Gyvas demo:
https://django-blog-2025.up.railway.app

