首页 > 解决方案 > 在 Django 中以小写形式显示 URL

问题描述

我的模型有一个零售商类别——例如——“沃尔玛”

我数据库中的所有零售商都以首字母大写输入。

我正在尝试在我的网站上显示零售商的产品列表。

我的网址如下所示:

path('retailer-deals/<str:retailer>', deals_by_retailer, name='retailer'),

我的观点是这样的:

def deals_by_retailer(request,retailer):
    retailer_deals = Deal.objects.filter(retailer__company=retailer).order_by('expired','-date_added')
    retailer = retailer
    return render(request, 'deals/deal_by_retailer.html', {'retailer_deals': retailer_deals, 'retailer': retailer})

所以如果我去retailer-deals/walmart什么都没有出现......

但当然retailer-deals/Walmart工作正常

我可能很挑剔——但我认为小写看起来更专业,以防walmart万一有人输入大写版本,我想确保它正确填充

我确实看到有人提到 (?i) 类似的问题,

我试着改变我的路径:

path('(?i)retailer-deals/<str:retailer>', deals_by_retailer, name='retailer'),

但这似乎不起作用..而且,如果我去列出具有关联链接的零售商 - 生成的 url 仍然会有大写的 url..

标签: pythonregexdjango

解决方案


您可以在过滤器中使用iexact,即不区分大小写的完全匹配。

retailer_deals = Deal.objects.filter(
        field_name__iexact=retailer).order_by('expired','-date_added')

正如许多其他人所建议的那样,最好的方法是使用 slug 进行此类查询,因此您将拥有:

from django.template.defaultfilters import slugify
import uuid 
class YourModel(mdoels):
     slug = models.SlugField()
     name = models.CharField(max_mength=100)

     # override the save method to have slug automatically generated
     def save(self, *args, **kwargs):
         if self.pk is None:
             slug = slugify(self.name)
             while self.__class__.objects.filter(slug=slug).exists():
                  slug = "%s-%s" % (slug,str(uuid.uuid4())[:5])
             self.slug = slug
         super(YourModel, self).save(*args, **kwargs)

您的网址将变为:

path('retailer-deals/<slug:slug>', deals_by_retailer, name='retailer'),

和你的看法:

def deals_by_retailer(request,slug):
    retailer_deals = Deal.objects.filter(retailer__slug=slug)
    ''' codes '''

推荐阅读