Django создание нескольких URL для одной и той же подкатегории - PullRequest
1 голос
/ 04 мая 2020

В моем приложении есть список категорий и подкатегорий с отношением ForeignKey. Скажем, есть:

  • Подкатегория1, связанная с категорией1
  • Подкатегория2, связанная с категорией2

Я ожидаю получить следующие URL подкатегории:

Эти URL работают нормально. Однако django также генерирует эти URL, которые мне не нужны:

Почему они появляются в моем приложении? Как мне от них избавиться? Заранее спасибо!

models.py:

class Category(models.Model):
    categoryslug = models.SlugField(max_length=200, default="",unique=True)

    def get_absolute_url(self):
        return reverse("showrooms_by_category",kwargs={'categoryslug': str(self.categoryslug)})

class Subcategory(models.Model):
    subcategoryslug = models.SlugField(max_length=200, default="",unique=True)
    category = models.ForeignKey('Category', related_name='subcategories', 
    null=True, blank=True, on_delete = models.CASCADE)

    def get_absolute_url(self):
        return reverse("showrooms_by_subcategory",
        kwargs={'categoryslug': str(self.category.categoryslug), 'subcategoryslug': str(self.subcategoryslug)})

views.py:

class ShowroomCategoryView(DetailView):
    model = Category
    context_object_name = 'showrooms_by_category'
    template_name = "website/category.html"
    slug_field = 'categoryslug'
    slug_url_kwarg = 'categoryslug'


class ShowroomSubcategoryView(DetailView):
    model = Subcategory
    context_object_name = 'showrooms_by_subcategory'
    template_name = "website/subcategory.html"
    slug_field = 'subcategoryslug'
    slug_url_kwarg = 'subcategoryslug'

urls.py:

urlpatterns = [
    path('<slug:categoryslug>/<slug:subcategoryslug>/', views.ShowroomSubcategoryView.as_view(), name='showrooms_by_subcategory'),
    path('<slug:categoryslug>/', views.ShowroomCategoryView.as_view(), name='showrooms_by_category'),
]

1 Ответ

0 голосов
/ 04 мая 2020

Я думаю, что причина этого foreign_key. Итак, я думаю, что вы можете использовать поле «один к одному», чтобы получить цель, например:

subcategoryslug = models.SlugField(max_length=200, default="",unique=True)
category = models.OneToOneField('Category', related_name='subcategories',null=True, blank=True, on_delete = models.CASCADE)

* Примечание: - Пожалуйста, поймите логику c позади нее. Для этого займитесь исследованиями подробнее.

...