Проблемы с оператором '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' }}