首页 > 解决方案 > 通过 django 应用程序创建 url

问题描述

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

在上面的 url 中,“companyslug”和“workerslug”是变量。

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

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

非常感谢!

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

标签: djangodjango-viewsdjango-urls

解决方案


您需要重命名其中一个 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')
    ...

推荐阅读