Django DetailView başka modelden veri çekme

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)


Tüm kodları aşağıdaki bağlantıya uygun olarak paylaşın.

1 Beğeni

sağolun hocam değiştirdim bilmiyordum teşekkürler

Yalnızca django.views.View kullanarak rahatça yapabilirsiniz. Genel yapısı basit aslında. get ve post (sınıftaki) metotlarını kullanın. Get isteği yapılırsa get post isteği yapılırsa post metodu çağrılır.

Hocam DetailView ile nasıl yapacğamı soruyorum ben.

Onunla yapamazsınız sanırım, fonksiyon view de yaptığınızın aynısını attığım posttaki gibi yapabilirsiniz.