2014-06-10 1 views
0

У меня есть страница под названием еда, которая получает параметр называется пищевой URL, который должен быть с _ вместо пробеловКак запустить метод строки на значение slug_field в детальном

url(r'^food/(?P<food_url>\w+)/$', Food.as_view()), 

Но столбец в модели (имя) использует пробелы

#the view 
class Food(DetailView): 
    model = Food 
    template_name = 'eat/food.html' 
    slug_field = 'name' 
    slug_url_kwarg = 'food_url' 

#the model 
class Food (models.Model): 
    name = models.CharField(max_length=40,unique=True) 
    description = models.TextField() 

    ingredients = models.ManyToManyField(Ingredient) 


    calories = models.IntegerField() 
    carbs = models.IntegerField() 
    protein = models.IntegerField() 
    fat = models.IntegerField() 

    prepTime = models.IntegerField() #minutes 

    LVL_CHOICES = (
    ('child','Child'), 
    ('beginner','Beginner'), 
    ('average','Average'), 
    ('pro','Pro') 
    ) 
    difficult_lvl = models.CharField(choices=LVL_CHOICES, max_length=8) 

    class Meta(): 
     ordering = ['name'] 
    def get_url (self): 
     return str(self.name).replace(' ','_') 

    def __str__(self): 
     return self.name 

есть ли способ запустить метод замены на величину food_url? Или любые другие решения

Благодаря

+0

В какой колонке или модели? Как это выглядит? – fecub

ответ

1

Вы могли бы сделать это гораздо более чисто с точки зрения функции на основе, однако, так как вы используете DetailView, я бы самый быстрый способ будет переопределить метод get_object. То, что я сделал, в основном принимает переданное значение имени и преобразует символы подчеркивания в пробелы. Очевидно, если у вас есть имена, содержащие пробелы и подчеркивания, это не сработает, и вам нужно будет разработать новую стратегию, чтобы справиться с этим.

Это, как говорится, я думаю, что вы должны создать фактическое поле пули на этой модели и убрать его значение 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 
Смежные вопросы