Django: расширение get_object для представлений на основе классов - PullRequest
7 голосов
/ 22 июля 2011

Будучи неопытным программистом Python, я ищу отзывы о том, как я расширил метод get_object класса SingleObjectMixin в Django.

Для большинства моих представлений Detail, поиск с использованием pk или slugfieldэто хорошо, но в некоторых случаях мне нужно получить объект на основе других (уникальных) полей, например, «имя пользователя».Я подклассифицировал DetailView Django и изменил метод get_object следующим образом:

# extend the method of getting single objects, depending on model
def get_object(self, queryset=None):

    if self.model != mySpecialModel:
        # Call the superclass and do business as usual 
        obj = super(ObjectDetail, self).get_object()
        return obj

    else:
        # add specific field lookups for single objects, i.e. mySpecialModel
        if queryset is None:
            queryset = self.get_queryset()

        username = self.kwargs.get('username', None)
        if username is not None:
            queryset = queryset.filter(user__username=username)
        # If no username defined, it's an error.
        else:
            raise AttributeError(u"This generic detail view %s must be called with "
                                 u"an username for the researcher."
                                 % self.__class__.__name__)

        try:
            obj = queryset.get()
        except ObjectDoesNotExist:
            raise Http404(_(u"No %(verbose_name)s found matching the query") %
                          {'verbose_name': queryset.model._meta.verbose_name})
        return obj

Это хорошая практика?Я пытаюсь иметь один подкласс Detailview, который приспосабливается к различным потребностям при извлечении различных объектов, но также поддерживает поведение по умолчанию для общих случаев.Или лучше иметь больше подклассов для особых случаев?

Спасибо за ваш совет!

Ответы [ 2 ]

9 голосов
/ 22 июля 2011

Вы можете установить переменную slug_field в классе DetailView для поля модели, которое должно использоваться для поиска! В шаблонах url он всегда должен называться slug, но вы можете сопоставить его с любым желаемым полем модели.

Кроме того, вы также можете переопределить метод DetailView get_slug_field, который возвращает self.slug_field по умолчанию!

0 голосов
/ 22 декабря 2011

Вы можете использовать наследование?

class FooDetailView(DetailView):
    doBasicConfiguration

class BarDetailView(FooDetailView):
    def get_object(self, queryset=None):
        doEverythingElse
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...