Проблемы с оператором 'if' для шаблонов Django и Django Models

Я работаю над сайтом сравнения цен, но столкнулся с проблемой, когда пытаюсь написать оператор if для разных продуктов, чтобы они показывали свои собственные детали, а не все поля деталей в каждом продукте.

views.py

from django.shortcuts import render, get_object_or_404

from .models import Category, Product, Brand, Smartphone_detail

def index(request):
    products = Product.objects.all()
    return render(request, 'core/home.html', {'products': products})

def categories(request):
    return {
        'categories': Category.objects.all()
    }

def product_detail(request, slug):
    product = get_object_or_404(Product, slug=slug, in_stock=True)
    return render(request, 'core/products/detail.html', {'product': product})

def category_list(request, category_slug):
    category = get_object_or_404(Category, slug=category_slug)
    products = Product.objects.filter(category=category)
    return render(request, 'core/products/category.html', {'category': category, 'products': products})

models.py

Я пытался использовать модели Case, When, чтобы получить результаты, которые я хочу, но не смог разобраться в этом, так что если кто-то знает хороший пост в блоге, который объясняет, как использовать модели case, value, when из django db, пожалуйста, дайте ссылку.

admin.py

from django.contrib import admin
from .models import Category, Product, Brand, Smartphone_detail, Smartphone_accessory_detail

@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
    list_display = ['name', 'slug']
    prepopulated_fields = {'slug': ('name',)}

@admin.register(Brand)
class BrandAdmin(admin.ModelAdmin):
    list_display = ['name', 'slug', 'description', 'image']
    prepopulated_fields = {'slug': ('name',)}
    
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    list_display = [
        'title', 'slug', 'price',
        'description', 'in_stock', 'image'
    ]
    prepopulated_fields = {'slug': ('title',)}

@admin.register(Smartphone_detail)
class Smartphone_detailAdmin(admin.ModelAdmin):
    list_display = [
        'name', 'brand', 'ram', 'storage',
        'camera', 'processor', 'fingerprint',
        'battery', 'charger', 'charging_speed'
    ]

@admin.register(Smartphone_accessory_detail)
class Smartphone_accessory_detailAdmin(admin.ModelAdmin):
    list_display = [
        'name', 'brand', 'type'
    ]

urls.py

from django.urls import path
from . import views

app_name = 'core'

urlpatterns = [
    path('', views.index, name='index'),
    path('product/<slug:slug>/', views.product_detail, name='product_detail'),
    path('search/<slug:category_slug>/', views.category_list, name='category_list'),
]

detail.html

Здесь, когда я пытаюсь написать оператор if, он перестает отображать эту таблицу на моей детальной странице. поэтому, если кто-нибудь может подсказать мне, как написать оператор if, который отображает только детали, связанные с этим продуктом, а не ненужные детали.

Мы не можем помочь вам с тем, как определить, является ли продукт смартфоном. Вы сами лучше всех разбираетесь в своей базе данных.

Однако, если определение сложное, то вам следует выполнить работу в Python и передать простое булево значение в ваш шаблон через контекст. Даже если определение не очень сложное, это может сделать шаблон гораздо более читабельным, чем частое повторение, скажем, {% if something == 'somevalue' and someotherthing != 'someothervalue' %}. (например, DRY).

Например

def product_detail(request, slug):

    product = get_object_or_404(Product, slug=slug, in_stock=True)

    # as many lines of code as it takes to determine the True/False
    # value of is_smartphone

    return render(request, 'core/products/detail.html', 
        {'product': product, 'is_smartphone': is_smartphone})

В ваших шаблонах

{% if is_smartphone %} ... {% endif %}

Иногда полезно

{{ is_smartphone|yesno:'smartphone text,other text' }}
Вернуться на верх