Merhaba Arkadaşlar
Class Based Views yapısını öğrenmeye çalışıyorum. Elimde şu dosyalar var :
models.py
from django.db import models
# Create your models here.
class Category(models.Model):
title = models.CharField(max_length=50,verbose_name='Kategori Adı')
def __str__(self):
return self.title
class Meta:
verbose_name = 'Kategori'
verbose_name_plural = 'Kategoriler'
ordering = ['title']
class Product(models.Model):
title = models.CharField(max_length=100, verbose_name='Ürün Adı')
category = models.ForeignKey(Category,on_delete=models.CASCADE, verbose_name='Kategori')
description = models.TextField(verbose_name='Açıklama')
image = models.ImageField(upload_to='products/',help_text='Önerilen boyutlar: 1170x540',verbose_name='Kapak Resmi')
is_published = models.BooleanField(default=True)
sorting = models.IntegerField(verbose_name='Sıra No')
slug = models.SlugField(unique=True)
created_date = models.DateTimeField(auto_now_add=True,verbose_name='Oluşturulma Tarihi')
def __str__(self):
return self.title
class Meta:
verbose_name = 'Ürün'
verbose_name_plural = 'Ürünler'
ordering = ['sorting']
class Images(models.Model):
title = models.CharField(max_length=100,verbose_name='Resim Adı')
product = models.ForeignKey(Product,on_delete=models.CASCADE,verbose_name='Ürün')
image = models.ImageField(upload_to='products/',verbose_name='Resim',null=True,blank=True)
def __str__(self):
return self.title
class Meta:
verbose_name = 'Resim'
verbose_name_plural = 'Resimler'
urls.py
from django.urls import path
from .views import ProductListView, ProductDetailView
from . import views
app_name = "product"
urlpatterns = [
path('', ProductListView.as_view(),name="product_list" ),
path('<slug:slug>/', ProductDetailView.as_view(),name="product_detail" ),
]
views.py
from django.shortcuts import render, get_object_or_404
from .models import Category,Product,Images
from django.views.generic import ListView,DetailView
class ProductListView(ListView):
model = Product
context_object_name = 'products'
queryset = Product.objects.filter(is_published=True)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['categories'] = Category.objects.all()
return context
class ProductDetailView(DetailView):
model = Product
context_object_name = 'product'
Benim istediğim ProductDetailView sayfasına, hangi ürün seçildiyse o ürünün resimlerini göndermek (Images modelinden)
Yani bu yapmak istediğimi function based views ile yaptım onun kodlarını şu şekilde paylaşıyorum (models.py aynı) :
urls.py
from django.urls import path
from . import views
app_name = "product"
urlpatterns = [
path('', views.productList,name="product_list" ),
path('<slug:slug>/<int:id>', views.productDetail, name="product_detail" ),
]
views.py
from django.shortcuts import render
from .models import Product,Category,Images
# Create your views here.
def productList(request):
product_list = Product.objects.all()
categories = Category.objects.all()
context = {
'product_list' : product_list,
'categories' : categories,
}
return render(request,'product/product_list.html',context)
def productDetail(request,slug,id):
product_detail = Product.objects.get(slug=slug)
product_images = Images.objects.filter(product_id=id)
context = {
'product_detail' : product_detail,
'product_images' : product_images,
}
return render(request, 'product/product_detail.html', context)