заставить обоих слагов в url существовать в базе данных - PullRequest
0 голосов
/ 19 октября 2018

У меня есть несколько категорий и некоторые детали, связанные с этими категориями через ForeignKey.

У меня есть, например, category1 и detail1.

Теперь я могу вызывать категории в url localhost: 8000 / categoryor1

 path('<slug>', views.CategorieView.as_view(), name='categorie_name')

и подробности: localhost: 8000 / categoryorie1/ detail1

path('<anythinghereworks>/<slug>', views.DetailView.as_view(), name='detail_name')

но, как написано в первом слаге, любой URL, например localhost: 8000 / abc / details1, будет работать.

Как сделать шаблон специфичным для 2 слагов?

#Model

class Categorie(models.Model):
name = models.CharField(max_length=50,unique=True)
slug = models.SlugField(max_length=100,unique=True)

def __str__(self):
    return self.name

class Detail(models.Model):
    title = models.CharField(max_length=100)
    slug= models.SlugField(max_length=100,unique=True)
    categorie = models.ForeignKey('Categorie', on_delete=models.CASCADE,  related_name="details")


    def __str__(self):
        return self.title 

#Views

class CategorieView(DetailView):
    model = Categorie
    slug_field = 'slug'
    template_name = "app/categories.html"

class DetailView(DetailView):
    model = Detail
    slug_field = 'slug'
    template_name = "app/details.html"

#URLs

path('<slug>', views.CategorieView.as_view(), name='categorie_name'),
path('<anythinghereworks>/<slug>', views.DetailView.as_view(), name='detail_name'),

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Сначала переименуйте 'anythinghereworks' во что-нибудь более полезное и переименуйте DetailView, чтобы избежать столкновения с DetailView Джанго.Например:

path('<cat_slug>/<slug>', views.MyDetailView.as_view(), name='detail_name')

Затем вы можете переопределить get_object для фильтрации по slug и cat_slug.

class MyDetailView(DetailView):
    def get_object(self):
        return Detail.objects.get(slug=self.kwargs['slug'], categorie__slug='self.kwargs['cat_slug'])

Или вы можете переопределить get_queryset и отфильтровать категориютам.Вам не нужно фильтровать slug=self.kwargs['slug'] здесь, потому что Django позаботится об этом в методе get_object.

class MyDetailView(DetailView):
    def get_queryset(self):
        queryset = super().get_queryset()
        queryset = queryset.filter(categorie__slug=self.kwargs['cat_slug'])
        return queryset

Вы можете удалить slug_field = 'slug' в обоих случаях, потому что 'slug' являетсязначение по умолчанию.В первом случае Django будет использовать ваш метод get_object, поэтому вообще не будет использовать slug_field.

0 голосов
/ 19 октября 2018

Вы используете slug: преобразователь пути [Django-doc] :

path('<<b>slug:</b>slug>', views.CategorieView.as_view(), name='categorie_name'),
path(
    '<<b>slug:</b>anythinghereworks>/<<b>slug:</b>slug>',
    views.<b>Detail</b>DetailView.as_view(),
    name='detail_name'
),

Преобразователь пути инкапсулирует регулярное выражениездесь указываются допустимые шаблоны (например, преобразователь пути int: будет соответствовать только последовательности цифр), а также преобразование между подстрокой в ​​URL-адресе и объектом.Это может быть строка, например, в случае slug, но преобразователь пути int:, например, нацелен на int.

. В ваших View s вы можете затем переопределитьget_queryset метод:

class <b>Detail</b>DetailView(DetailView):
    model = Detail
    slug_field = 'slug'
    template_name = "app/details.html"

    def <b>get_queryset</b>(self):
        return super(DetailView, self).get_queryset().filter(
            category__slug=self.request.kwargs['anythinghereworks']
        )

для правильной фильтрации набора запросов.Для запроса с неверным значением slug или anythinghereworks это повысит 404.

Также (настоятельно) желательно не назвать что-либо DetailView, так как оно будет перезаписать ссылка в вашем модуле на новый созданный класс, и, следовательно, другие представления в файле, будут наследоваться от вашего DetailView.

Однако я советуюискать лучшую номенклатуру, чем anythinghereworks.Например, вы можете переименовать параметры в category_slug и detail_slug.Это позволит избежать путаницы и, следовательно, (потенциальных) ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...