【问题标题】:Display URL in Lower Case in Django在 Django 中以小写形式显示 URL
【发布时间】:2018-10-19 01:11:15
【问题描述】:

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

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

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

我的网址是这样的:

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/&lt;str:retailer&gt;', deals_by_retailer, name='retailer'),

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

【问题讨论】:

  • 在创建链接时,您可以更改大小写或尝试 slug 字段。
  • 是的 - 没错 - 没有考虑过 - 然后我遇到的唯一其他问题是空格的 %20 ..所以输入一个新的 slugify 可能是有意义的我认为的领域
  • 什么是retailer = retailer

标签: python regex django


【解决方案1】:

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

【讨论】:

  • 是的!我更新了我的答案,让您知道如何将它与 slug 一起使用,如何生成一个,以及如何确保 slug 是唯一的
  • 非常感谢!如果我已经在我的零售商字段中保存了一堆记录,这会自动使我的字段变得模糊还是我需要手动执行?
  • 您可以删除该行if self.pk is None: 并循环遍历所有记录,然后调用save 方法,将自动为循环内的每个记录生成slug,我上面的代码就可以了。 . ie : for obj in Record.objects.all(): obj.save() 不要忘记删除 if self.pk is None,完成后将其放回
  • @Lemayzeur 你打错字了slug = slugigy(self.name)
【解决方案2】:

我将间接回答您的问题,因为我认为在您的路线中使用iexact 过滤器是一种代码异味。它还向人们打开了类似retailer-deals/WaLmArT 这样的路径,如果你为了简单起见切换到带有slug的设置,那么这些路径就会中断。

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

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

from django.urls import path

from . import views

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

the docs 中有更多关于此示例的信息。

对于这个用例,Django 有一个内置的 SlugField 模型字段。您也可以在 Django 管理员中从另一个字段(例如标题)prepopulate it

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

【讨论】:

  • 谢谢 Taylor — 我也开始考虑添加一个蛞蝓,我认为您的 cmets 绝对正确。
  • @JohnRogerson 乐于助人!我已经有几年没有写过 Django 了,在使用其他框架之后,很容易忘记 Django 开箱即用的所有细节:)。顺便说一句,Two Scoops of Django 一书令人难以置信,如果您想了解更多最佳实践,它会提炼出更多信息。
  • 是的,我有那本书——这是我最喜欢的 Django 书之一!
  • 你说得对,我只是想为@JohnRogerson 指出不区分大小写查询的正确方法,但到目前为止,slug 是最好的方法
  • @Lemayzeur 当然——我个人同意。我认为同时拥有您的直接答案和我的间接答案有助于未来人们通过像 OP 这样的查询偶然发现这个问题。
【解决方案3】:

你的路径是找到。

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

您的&lt;str:retailer&gt; 是您的请求获得的一些参数。

这意味着它不是修复一个。你可以附加任何你想要的东西——比如pkslugtitleuuid等等。

所以在你的情况下,如果你想在你的 url 中使用小写,你可以将你自己的 slug 添加到你的模型中,并将它传递给你的 url。

您的网址将是

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 字段可以获取它们)。因此,您可以从您的公司制作 slug - 独特且非常适合 url。

【讨论】:

    猜你喜欢
    • 2018-03-20
    • 2023-01-20
    • 2021-10-31
    • 2011-10-24
    • 2016-08-15
    • 2012-11-14
    • 2011-08-06
    • 2018-05-19
    • 1970-01-01
    相关资源
    最近更新 更多