通过 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')
...
我有两个应用程序和两个模型。我想生成以下 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')
...