У модели Рroduct, должна быть связь с категорией через ФК. В дальнейшем через эту связь можно вытащить все данные, по этой категории, в том числе и для формирования урлов. С другой стороны, не имеет смысла городить огород с таким урлом! Создайте адрес для просмотра конкретного товара, а инфо о категории, к которой принадлежит данный товар, вытаскивайте через ФК.
Т.е. у Вас будут пакеты урлов отдельно для категорий (список всех и детализация отдельной) и отдельно для товаров.
У меня такая же проблема. В моделях я через foreign key вытащил url, а как использовать его в urlpatterns не ясно.
models.py
from __future__ import unicode_literals
import datetime
from django.utils import timezone
from django.db import models
from ckeditor.fields import RichTextField
from django.contrib import admin
from django.db.models.signals import pre_save
from django.utils.text import slugify
from transliterate import translit
# Create your models here.
class Category(models.Model):
id = models.AutoField
name = models.CharField(max_length=120)
cat_slug = models.SlugField(blank=True, max_length=120, unique=True)
image = models.ImageField(upload_to='images/%Y/%m/%d/', null=False, blank=False, default="")
def __unicode__(self):
return self.name
def __str__(self):
return self.name
def get_absolute_url(self):
return "/%s/" %(self.cat_slug)
class Meta:
verbose_name = 'Категория'
verbose_name_plural = 'Категории'
def pre_save_category_slug(sender, instance, *args, **kwargs):
if not instance.cat_slug:
cat_slug = slugify(translit(str(instance.name), reversed=True))
instance.cat_slug = cat_slug
pre_save.connect(pre_save_category_slug, sender=Category)
class SubCategory(models.Model):
id = models.AutoField
name = models.CharField(max_length=120)
subcat_slug = models.SlugField(blank=True, max_length=120, unique=True)
category = models.ForeignKey(Category, to_field="cat_slug", null=False, blank=False, verbose_name="Категория", on_delete=models.PROTECT)
image = models.ImageField(upload_to='images/%Y/%m/%d/')
def __unicode__(self):
return self.name
def __str__(self):
return self.name
def get_absolute_url(self):
c = SubCategory.objects.select_related('category').get(pk=self.id)
return "/%s%s%s/" %(c.category.cat_slug, "/", self.subcat_slug)
class Meta:
verbose_name = 'Подкатегория'
verbose_name_plural = 'Подкатегории'
def pre_save_subcategory_slug(sender, instance, *args, **kwargs):
if not instance.subcat_slug:
subcat_slug = slugify(translit(str(instance.name), reversed=True))
instance.slug = subcat_slug
pre_save.connect(pre_save_subcategory_slug, sender=SubCategory)
class Post(models.Model):
id = models.AutoField
title = models.CharField(max_length=120, verbose_name="Название статьи")
post_slug = models.SlugField(blank=True, max_length=120, unique=True)
description = models.TextField(default='Описание')
keywords = models.CharField(max_length=120, default='Ключевые слова')
sub_category = models.ForeignKey(SubCategory, null=False, blank=False, verbose_name="Подкатегория", on_delete=models.PROTECT, default="")
content = RichTextField()
visible = models.BooleanField(default=1, verbose_name="Опубликовано?")
updated = models.DateTimeField(auto_now=True, auto_now_add=False, verbose_name="Обновлено")
timestamp = models.DateTimeField(auto_now=False, auto_now_add=True, verbose_name="Опубликовано")
def __unicode__(self):
return self.title
def __str__(self):
return self.title
def get_absolute_url(self):
s = Post.objects.select_related('sub_category')
return "/%s%s/" %(s.sub_category.subcat_slug, self.post_slug)
class Meta:
ordering = ["-id", "-timestamp"]
verbose_name = 'Статья'
verbose_name_plural = 'Статьи'
def pre_save_post_slug(sender, instance, *args, **kwargs):
if not instance.slug:
slug = slugify(translit(str(instance.title), reversed=True))
instance.slug = slug
pre_save.connect(pre_save_post_slug, sender=Post)
blog.urls.py
from django.urls import path, re_path
from django.conf import settings
from django.conf.urls.static import static
from . import views
urlpatterns = [
path('', views.BlogCategory, name='categoty_list'),
path('<slug:cat_slug>/', views.BlogSubCategoryList, name='sub_category_list')
path('<slug:subcat_slug>/', views.BlogPostList, name='post_list')
выходит ошибка invalid syntax (urls.py, line 10 последняя строчка)
Будьте добры, приведите пример, как правильно указывать url
Updated 24 April 2019, 13:30 by fof_fa.