在Django中以小写形式显示网址

时间:2018-05-09 02:06:41

标签: python regex django

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

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

我试图在我的网站上显示零售商的产品清单。

我的网址看起来像这样:

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

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

3 个答案:

答案 0 :(得分:2)

您可以在过滤器中使用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 '''

答案 1 :(得分:1)

我将间接回答您的问题,因为我认为在您的路线中执行iexact过滤器会产生代码异味。它还可以让人们打开像retailer-deals/WaLmArT这样的路径,如果你为了简单起见而转向使用slu g的设置,那么这些路径就会中断。

最佳做法是使用slugs来定义URL以延长寿命。名称中使用的空格,标点符号和非ASCII字符编码等内容可能会导致丑陋或无效的URL。

您可以在urlpatterns中使用slu ::

from django.urls import path

from . import views

urlpatterns = [
    ...
    path('widgets/<slug:slug>/', views.foo),
]

此示例中the docs还有更多信息。

Django为此用例提供了内置的SlugField模型字段。您还可以从另一个字段(例如title)中的Django管理员prepopulate it

class WidgetAdmin(admin.ModelAdmin):
    prepopulated_fields = {"slug": ("title",)}

答案 2 :(得分:0)

找到你的路径。

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

您的<str:retailer>是您的请求获得的一些参数。

这意味着它不能解决问题。您可以附加任何内容 - 例如pkslugtitleuuid等。

因此,在您的情况下,如果您想在网址中使用小写,您可以将自己的slug添加到模型中,并将其传递给您的网址。

您的网址将是

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

您的观点将是

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

此外,您还必须向模型中添加slug

# maybe your Retailer model
Retailter(models.Model):
    ...
    slug = models.CharField(
        max_length=100,
        verbose_name="slug",
    )
    ...

    # You can save slug automaticall when saving 
    # using __save__ or signals
  

在url中使用slug是很好的方法,原因很多(url不支持空格和许多其他字符,但是你的company字段可以获取它们)。所以你可以从你的公司制作slu - - 独特且非常适合url。