Python Django su Blogu + Vartotojų Sistema + Admin Panelės Kūrimas

Pradėjo Gozge, Gru 12, 2025, 11:52 AM

« ankstesnis - sekantis »

Gozge

2025 m. Turkijoje vis dar labiausiai pageidaujamas Python framework'as: Django 5

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)

pip install django==5.1
django-admin startproject blogproject
cd blogproject
python manage.py startapp blog

Su Docker (rekomenduojama):

curl -SSL https://raw.githubusercontent.com/django/django/main/django/bin/dja # Arba tiesiogiai: django-admin startproject blogproject .


2. Būtini Paketai

pip install psycopg2-binary django-allauth django-tailwind django-crispy-form

3. settings.py – 2025 Geriausi Nustatymai (sutrumpinti)

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)

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)

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)

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)

{% 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

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

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