Создать URL через приложения Django - PullRequest
0 голосов
/ 03 июля 2018

У меня два приложения с двумя моделями. Я хотел бы создать следующую структуру URL: http://example.com/company/'companyslug'/worker/'workerslug'

В URL выше 'companyslug' и 'workerlug' являются переменными.

Я уже просмотрел множество постов, но не нашел решения для этого. Основная проблема заключается в том, что, если система генерирует ссылку, значение, оцениваемое оба раза как атрибут модели работника.

Есть ли у вас какие-либо идеи, как я могу создать ссылку, как показано выше?

Большое спасибо!

app1 / models.py

class Company(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=150)
    slug = models.SlugField(max_length=150, unique=True)

app2 / models.py

class Worker(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    rel_company_worker = models.ForeignKey('app1.Company', on_delete = models.CASCADE, null=True,related_name='workers')
    first_name = models.CharField(,max_length= 50, blank=True )
    last_name = models.CharField(,max_length= 50, blank=True )
    slug = models.SlugField(max_length=100, null=True)

У меня есть 3 файла URL: urls.py

urlpatterns = [
    path("company/", include('app1.urls')),
]

app1 / urls.py

urlpatterns = [
    path('<slug:slug>/worker/',include('app2.urls')),
]

app2 / urls.py

urlpatterns = [
    path('<slug:slug>',views.WorkerDetailView.as_view(), name ='worker-detail-view'),
]

app2.views.py

class WorkerDetailView(generic.DetailView):
    model = Worker

Если я запускаю код, он генерирует следующую ссылку:

http://example.com/company/**'workerslug'**/worker/**'workerslug'**

1 Ответ

0 голосов
/ 03 июля 2018

Вам необходимо переименовать один из слагов, например:

urlpatterns = [
    path('<slug:company_slug>/worker/', include('app2.urls')),
]

Затем переопределите набор запросов в подробном представлении, чтобы включить только работников из компании.

class WorkerDetailView(DetailView):
    def get_queryset(self):
        queryset = super(WorkerDetailView, self).get_queryset()
        return queryset.filter(rel_company_worker__slug=self.kwargs['company_slug'])

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

urlpatterns = [
    path('<slug:company_slug>/worker/<slug:slug>', views.WorkerDetailView.as_view(), name ='worker-detail-view'),
]

Я бы также рассмотрел вопрос о переименовании внешнего ключа для модели Company в company:

class Worker(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    company = models.ForeignKey('app1.Company', on_delete = models.CASCADE, null=True, related_name='workers')
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...