Python 如何在详细视图中对slug_字段值运行string方法
我有一个名为food的页面,它获取一个名为food url的参数,该参数需要 用u代替空格Python 如何在详细视图中对slug_字段值运行string方法,python,django,django-views,Python,Django,Django Views,我有一个名为food的页面,它获取一个名为food url的参数,该参数需要 用u代替空格 url(r'^food/(?P<food_url>\w+)/$', Food.as_view()), 有没有办法对food_url值运行replace方法?或任何其他解决方案 感谢您,使用基于函数的视图可以更清晰地执行此操作,但是由于您使用的是DetailView,我认为最快的方法是重写此方法。我所做的基本上是获取传入的名称值,并将下划线转换为空格。显然,如果你的名字中包含空格和下划线,这是
url(r'^food/(?P<food_url>\w+)/$', Food.as_view()),
有没有办法对food_url值运行replace方法?或任何其他解决方案
感谢您,使用基于函数的视图可以更清晰地执行此操作,但是由于您使用的是DetailView,我认为最快的方法是重写此方法。我所做的基本上是获取传入的名称值,并将下划线转换为空格。显然,如果你的名字中包含空格和下划线,这是行不通的,你需要设计一个新的策略来处理这个问题 也就是说,我认为您应该在该模型上创建一个实际的slug字段,并让它slagify
name
字段的值
class Food(DetailView):
model = Food
template_name = 'eat/food.html'
slug_field = 'name'
slug_url_kwarg = 'food_url'
def get_object(self, queryset=None):
"""
Returns the object the view is displaying.
By default this requires `self.queryset` and a `pk` or `slug` argument
in the URLconf, but subclasses can override this to return any object.
"""
# Use a custom queryset if provided; this is required for subclasses
# like DateDetailView
if queryset is None:
queryset = self.get_queryset()
# Next, try looking up by primary key.
pk = self.kwargs.get(self.pk_url_kwarg, None)
slug = self.kwargs.get(self.slug_url_kwarg, None)
if pk is not None:
queryset = queryset.filter(pk=pk)
# Next, try looking up by slug.
elif slug is not None:
###########
# Convert the underscores into spaces.
###########
slug = slug.replace('_', ' ')
###########
slug_field = self.get_slug_field()
queryset = queryset.filter(**{slug_field: slug})
# If none of those are defined, it's an error.
else:
raise AttributeError("Generic detail view %s must be called with "
"either an object pk or a slug."
% self.__class__.__name__)
try:
# Get the single item from the filtered queryset
obj = queryset.get()
except queryset.model.DoesNotExist:
raise Http404(_("No %(verbose_name)s found matching the query") %
{'verbose_name': queryset.model._meta.verbose_name})
return obj
哪个栏目或模型?它看起来怎么样?
class Food(DetailView):
model = Food
template_name = 'eat/food.html'
slug_field = 'name'
slug_url_kwarg = 'food_url'
def get_object(self, queryset=None):
"""
Returns the object the view is displaying.
By default this requires `self.queryset` and a `pk` or `slug` argument
in the URLconf, but subclasses can override this to return any object.
"""
# Use a custom queryset if provided; this is required for subclasses
# like DateDetailView
if queryset is None:
queryset = self.get_queryset()
# Next, try looking up by primary key.
pk = self.kwargs.get(self.pk_url_kwarg, None)
slug = self.kwargs.get(self.slug_url_kwarg, None)
if pk is not None:
queryset = queryset.filter(pk=pk)
# Next, try looking up by slug.
elif slug is not None:
###########
# Convert the underscores into spaces.
###########
slug = slug.replace('_', ' ')
###########
slug_field = self.get_slug_field()
queryset = queryset.filter(**{slug_field: slug})
# If none of those are defined, it's an error.
else:
raise AttributeError("Generic detail view %s must be called with "
"either an object pk or a slug."
% self.__class__.__name__)
try:
# Get the single item from the filtered queryset
obj = queryset.get()
except queryset.model.DoesNotExist:
raise Http404(_("No %(verbose_name)s found matching the query") %
{'verbose_name': queryset.model._meta.verbose_name})
return obj