Python 在Django中以小写形式显示URL

Python 在Django中以小写形式显示URL,python,regex,django,Python,Regex,Django,我的模型有一个零售商类别——例如“沃尔玛” 我数据库中的所有零售商都是以大写字母输入的 我试图在我的网站上显示零售商的产品列表 我的url看起来是这样的: path('retailer-deals/<str:retailer>', deals_by_retailer, name='retailer'), 所以,如果我去零售商交易/walmart什么也看不到 当然,零售商交易/Walmart运作良好 我可能会吹毛求疵,但我认为小写的沃尔玛看起来更专业,为了防止有人输入大写版本,我想确

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

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

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

我的url看起来是这样的:

path('retailer-deals/<str:retailer>', deals_by_retailer, name='retailer'),
所以,如果我去
零售商交易/walmart
什么也看不到

当然,
零售商交易/Walmart
运作良好

我可能会吹毛求疵,但我认为小写的沃尔玛看起来更专业,为了防止有人输入大写版本,我想确保它的填充正确

我确实看到有人提到a(?I)用于类似的问题

我试着改变我的道路:

path(“(?i)零售商交易/”,按零售商进行交易,name='零售商'),

但这似乎不起作用……而且,如果我列出有关联链接的零售商——生成的url仍将包含大写url。

您可以在过滤器中使用,不区分大小写的精确匹配

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)
您的url将变成:

path('retailer-deals/<slug:slug>', deals_by_retailer, name='retailer'),
您可以在过滤器中使用不区分大小写的精确匹配

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)
您的url将变成:

path('retailer-deals/<slug:slug>', deals_by_retailer, name='retailer'),
你的道路就是寻找

path('retailer-deals/<str:retailer>', 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不支持空格和许多其他字符,但您的
公司
字段可以获得它们)。所以你可以从你的公司制作slug——独一无二,非常适合url

你的道路就是寻找

path('retailer-deals/<str:retailer>', 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不支持空格和许多其他字符,但您的
公司
字段可以获得它们)。所以你可以从你的公司制作slug——独一无二,非常适合url


我将间接回答您的问题,因为我认为在您的路由中执行
iexact
过滤器是一种代码气味。它还为人们打开了输入路径的窗口,比如
零售商交易/WaLmArT
,如果你为了简单起见切换到一个带有slug的设置,那么这个路径就会中断

最佳实践是使用slug定义URL以延长使用寿命。名称中使用的空格、标点符号和非ASCII字符编码等可能会导致URL丑陋或无效

您可以在
urlpatterns
中使用slug,如:

from django.urls import path

from . import views

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

我将间接回答您的问题,因为我认为在您的路由中执行
iexact
过滤器是一种代码气味。它还为人们打开了输入路径的窗口,比如
零售商交易/WaLmArT
,如果你为了简单起见切换到一个带有slug的设置,那么这个路径就会中断

最佳实践是使用slug定义URL以延长使用寿命。名称中使用的空格、标点符号和非ASCII字符编码等可能会导致URL丑陋或无效

您可以在
urlpatterns
中使用slug,如:

from django.urls import path

from . import views

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


在创建链接时,您可以更改案例或尝试slug字段。是的--没错--我没有考虑过--然后我遇到的另一个问题是空间的%20。因此,在创建链接时,输入一个新的slugify字段可能是有意义的,我想什么是
retailer=retailer
,您可以更改案例或尝试slug field。是的——没错——我没有考虑过这一点——然后我遇到的另一个问题是空间的%20。因此,输入一个新的slug field可能是有意义的。我想什么是
retailer=retailer
?谢谢Taylor-我也开始考虑添加slug,我认为您的评论是正确的“完全正确!”约翰·罗格森很乐意帮忙!我已经有几年没有编写Django了,在使用其他框架之后,很容易忘记Django附带的所有细节:)。顺便说一句,这本书《两勺Django》是难以置信的,如果你想看到更多的最佳实践,它可以提炼出更多的信息。是的,我有这本书——它是我最喜欢的Django之一!你完全正确,我只是想为@JohnRogerson指出不区分大小写查询的正确方法,但是slug是最好的方法far@Lemayzeur当然,我个人同意。我认为你的直接回答和我的间接回答都有助于未来的人们在这个问题上遇到类似OP的问题。谢谢Taylor——我也开始考虑添加一个slug,我认为你的评论绝对正确。@JohnRogerson很乐意帮你!我已经有几年没有编写Django了,在使用其他框架之后,很容易忘记Django附带的所有细节:)。顺便说一句,这本书《两勺Django》是难以置信的,如果你想看到更多的最佳实践,它可以提炼出更多的信息。是的,我有这本书——它是我最喜欢的Django之一!你完全正确,我只是想为@JohnRogerson指出不区分大小写查询的正确方法,但是slug是最好的方法far@Lemayzeur当然,我个人同意。我认为你的直接回答和我的间接回答都有助于未来的人们在这个问题上遇到类似OP的问题!我更新了我的答案,让您知道如何使用
slug
,如何生成一个,以及如何确保slug是唯一的,谢谢!如果我已经在我的“零售商”字段中保存了一堆记录,这会自动对我的字段进行缓冲还是我需要手动进行缓冲?如果self.pk为None:,则可以删除该行,并循环所有记录,然后调用save方法,循环中的每个记录都会自动生成缓冲,我上面的代码将实现这一点。。i、 e:
用于记录中的obj.objects.all():obj.save()