Django在浏览器url中显示模型的Id,而不是模型名称



我在django中的新应用程序中为公司创建了模型,并为其创建了实例,以显示每个公司的详细信息页面。但当点击一家公司时,它会显示该公司的id,而不是URL中的名称,如下所示:http://127.0.0.1:8000/companies/2/

有没有办法让它像这样返回公司名称:http://127.0.0.1:8000/companies/stackoverflow/

这是我的模型的代码,我使用基于函数的视图:

class Company(models.Model):
Online_Merchant = 'merch'
Education = 'edu'
Transportation = 'trans'
Hospitalism = 'hosp'
Healthcare = 'health'
Construction = 'const'
Blog = 'blog'
Finance = 'fin'
Media = 'media'
Government_Agency = 'agency'
Other = 'other'
Manufacturing = 'manufacturing'
sector = [
(Online_Merchant, 'Online Merchant'),
(Education, 'Education'),
(Transportation, 'Transportation'),
(Hospitalism, 'Hospitalism'),
(Healthcare, 'Healthcare'),
(Construction, 'Construction'),
(Blog, 'Blog'),
(Finance, 'Finance'),
(Media, 'Media'),
(Manufacturing, 'Manufacturing'),
(Government_Agency, 'Government Agency'),
(Other, 'Other')
]
Free = 'Free'
Premium = 'Premium'
package = [
(Free, 'Free'),
(Premium, 'Premium')
]

user = models.ForeignKey(User, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='Company User')
company_sector = models.CharField(max_length=30, choices=sector, default=Online_Merchant, verbose_name='Sector')
company_name = models.CharField(max_length=100)
company_description = models.TextField()
company_logo = models.ImageField(upload_to='company_logos', blank=True, null=True)
company_address = models.TextField(max_length=2000)
rating_array = ArrayField(models.IntegerField(), size=0, default=list)
average_rating = Int_max.IntegerRangeField(default=0, verbose_name='Avg', min_value=1, max_value=5)
total_views = models.IntegerField(default=0)
company_website = models.CharField(max_length=500, blank=True, null=True)
company_email = models.EmailField(max_length=500, blank=True, null=True)
company_phone = models.CharField(max_length=500)
package_chosen = models.CharField(max_length=8, choices=package, default=Free)
company_views = models.IntegerField(default=0)
featured = models.BooleanField(default=False)
advert = models.BooleanField(default=False)
premium = models.BooleanField(default=False)
def get_absolute_url(self):
"""Returns the url to access a particular instance of the model."""
return reverse("detail", kwargs={ "id": self.id })
def __str__(self):
return self.company_name
def __repr__(self):
return self.company_name

SlugField就是为此而设计的。django管理员也将帮助填充它。

型号.py

class Company(models.Model):
...other model fields...
company_slug = models.SlugField(max_length=255, allow_unicode=True)
def get_absolute_url(self):
"""Returns the url to access a particular instance of the model."""
return reverse("detail", kwargs={ "slug": self.company_slug })

admin.py

class CompanyAdmin(admin.ModelAdmin):
prepopulated_fields = {"company_slug": ("company_name",)}
...admin code...

并在查询中使用:

company = Company.objects.get(company_slug=kwargs.get('company_slug')

urls.py

urlpatterns = [ path('<slug:company_slug>/', views.dynamic_url, name='detail'), ] 

最新更新