簡體   English   中英

在Django中以小寫形式顯示URL

[英]Display URL in Lower Case in 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'),

但這似乎不起作用....而且,如果我用相關鏈接列出零售商,則生成的url仍將包含大寫url。

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

我將間接回答您的問題,因為我認為在路由中執行iexact過濾器會產生代碼異味。 它還為您打開了鍵入retailer-deals/WaLmArT類的路徑的retailer-deals/WaLmArT ,如果您切換到一條retailer-deals/WaLmArT的安裝程序(為簡單起見),該路徑就會中斷。

最佳做法是使用段來定義URL以延長使用壽命。 名稱中使用空格,標點符號和非ASCII字符編碼之類的內容可能會造成難看或無效的URL。

您可以在urlpatterns使用slug:

from django.urls import path

from . import views

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

在此示例的文檔中有更多信息。

Django在此用例中具有內置的SlugField模型字段。 您還可以在Django管理員中從另一個字段(例如title) 預填充它

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

找到你的路。

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

您的<str:retailer>是您的請求得到的一些參數。

這意味着它不是固定的。 您可以附加任何想要的東西-如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})

另外,您還必須向模型添加塊

# 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字段可以獲取它們)。 因此,您可以從您的公司中獲得產品-獨特且非常適合url。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM