通过 django 应用程序创建 url

Create url through django apps

我有两个应用程序和两个模型。我想生成以下 url 结构:http://example.com/company/'companyslug'/worker/'workerslug'

在url上面的'companyslug'和'workerslug'是变量。

我已经 运行 看了很多帖子,但我没有找到任何解决方案。 主要问题是,如果系统生成 link 两次评估的值作为 Worker 模型的属性。

你有什么想法,我怎样才能生成一个像上面那样的 link?

非常感谢!

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 个 urls 文件: 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

如果我 运行 生成以下代码 link:

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

您需要重命名其中一个 slug,例如:

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'])

顺便说一句,您的嵌套包含使您的网址难以理解。我会考虑摆脱第二个包含并将其更改为:

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')
    ...