dynamic news
This commit is contained in:
@@ -1,9 +1,13 @@
|
||||
from rest_framework import serializers
|
||||
|
||||
from sitemanagement.models import FAQ
|
||||
from sitemanagement.models import FAQ, News
|
||||
|
||||
class FAQMainSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = FAQ
|
||||
fields = "__all__"
|
||||
|
||||
|
||||
class NewsMainSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = News
|
||||
fields= "__all__"
|
||||
@@ -3,8 +3,8 @@ from rest_framework.views import APIView
|
||||
from rest_framework.response import Response
|
||||
from api.utils.decorators import handle_exceptions
|
||||
|
||||
from api.main.serializers import FAQMainSerializer
|
||||
from sitemanagement.models import FAQ
|
||||
from api.main.serializers import FAQMainSerializer, NewsMainSerializer
|
||||
from sitemanagement.models import FAQ, News
|
||||
|
||||
class FAQView(APIView):
|
||||
@handle_exceptions
|
||||
@@ -16,4 +16,15 @@ class FAQView(APIView):
|
||||
'faqs': FAQMainSerializer(faqs, many=True).data
|
||||
}
|
||||
|
||||
return Response(data, status=status.HTTP_200_OK)
|
||||
class NewsView(APIView):
|
||||
@handle_exceptions
|
||||
def get(self, request):
|
||||
|
||||
news = News.objects.all()
|
||||
|
||||
data = {
|
||||
'news': NewsMainSerializer(news, many=True).data
|
||||
}
|
||||
|
||||
return Response(data, status=status.HTTP_200_OK)
|
||||
@@ -1,7 +1,8 @@
|
||||
from django.urls import path
|
||||
|
||||
from api.main.views import FAQView
|
||||
from api.main.views import FAQView, NewsView
|
||||
|
||||
urlpatterns = [
|
||||
path("v1/faq/", FAQView.as_view(), name='faqMain'),
|
||||
path("v1/news/", NewsView.as_view(), name="newsmain")
|
||||
]
|
||||
@@ -1,7 +1,9 @@
|
||||
from django.contrib import admin
|
||||
from django.urls import path, include
|
||||
from django.conf import settings
|
||||
from django.conf.urls.static import static
|
||||
|
||||
urlpatterns = [
|
||||
path('admin/', admin.site.urls),
|
||||
path('api/', include('api.urls')),
|
||||
]
|
||||
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
# Generated by Django 5.2.1 on 2025-05-16 07:52
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('sitemanagement', '0005_news_created_at_alter_news_slug'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='news',
|
||||
name='filename',
|
||||
field=models.CharField(blank=True, max_length=255),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='news',
|
||||
name='path',
|
||||
field=models.CharField(blank=True, max_length=255),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,23 @@
|
||||
# Generated by Django 5.2.1 on 2025-05-16 08:01
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('sitemanagement', '0006_news_filename_news_path'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='news',
|
||||
name='slug',
|
||||
field=models.SlugField(blank=True, editable=False, max_length=255, null=True),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='news',
|
||||
name='titleImage',
|
||||
field=models.ImageField(upload_to='news/images/', verbose_name='Главная картинка'),
|
||||
),
|
||||
]
|
||||
@@ -20,11 +20,14 @@ class FAQ (models.Model):
|
||||
|
||||
|
||||
class News(models.Model):
|
||||
titleImage = models.ImageField(verbose_name="Главная картинка")
|
||||
titleImage = models.ImageField(upload_to='uploads/news/images/', verbose_name="Главная картинка")
|
||||
title = models.CharField(max_length=100, verbose_name="Заголовок")
|
||||
content = models.TextField(max_length=1000, verbose_name="Контент статьи")
|
||||
slug = models.SlugField(null=True, blank=True, editable=False)
|
||||
slug = models.SlugField(max_length=255, null=True, blank=True, editable=False)
|
||||
created_at = models.DateTimeField(auto_now_add=True, null=True, blank=True)
|
||||
filename = models.CharField(max_length=255, blank=True)
|
||||
path = models.CharField(max_length=255, blank=True)
|
||||
|
||||
class Meta:
|
||||
verbose_name = 'Новость'
|
||||
verbose_name_plural = 'Новости'
|
||||
@@ -34,17 +37,20 @@ class News(models.Model):
|
||||
return self.title
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
super().save(*args, **kwargs) #сохраняем изображение
|
||||
|
||||
# генерируем путь к файлу если удалось его сохранить
|
||||
if self.titleImage:
|
||||
self.filename = os.path.basename(self.titleImage.name)
|
||||
self.path = f'{settings.BASE_URL}{settings.MEDIA_URL}{self.titleImage.name}'
|
||||
super().save(*args, **kwargs) # записываем путь и имя файла в базу
|
||||
if not self.pk: # Только при первом сохранении
|
||||
super().save(*args, **kwargs) # сохраняем изображение
|
||||
|
||||
# генерируем путь к файлу если удалось его сохранить
|
||||
if self.titleImage:
|
||||
self.filename = os.path.basename(self.titleImage.name)
|
||||
self.path = f'{settings.BASE_URL}{settings.MEDIA_URL}{self.titleImage.name}'
|
||||
super().save(*args, **kwargs) # записываем путь и имя файла в базу
|
||||
else:
|
||||
self.filename = ''
|
||||
self.path = ''
|
||||
else:
|
||||
self.filename = ''
|
||||
self.path = ''
|
||||
|
||||
super().save(*args, **kwargs)
|
||||
|
||||
@receiver(pre_save, sender=News)
|
||||
def generate_slug(sender, instance, **kwargs):
|
||||
if not instance.slug:
|
||||
|
||||
Reference in New Issue
Block a user