我的模型有零售商的类别 - 例如 - “沃尔玛”
我的数据库中的所有零售商都已输入首字母大写。
我试图在我的网站上显示零售商的产品清单。
我的网址看起来像这样:
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'),
但这似乎不起作用....而且,如果我去列出具有相关链接的零售商 - 生成的网址仍然会有大写网址..
答案 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>
是您的请求获得的一些参数。
这意味着它不能解决问题。您可以附加任何内容 - 例如pk
,slug
,title
,uuid
等。
因此,在您的情况下,如果您想在网址中使用小写,您可以将自己的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。