Обработка нескольких исключений в CBV Django - PullRequest
0 голосов
/ 22 апреля 2019

Есть ли способ, с помощью которого я могу обрабатывать оба исключения из разных моделей и по-прежнему не передавать ни одного из них в качестве контекста по отдельности.

Views.py

class ProfilePage(DetailView):
    model = models.UserCreation
    context_object_name = 'profile'

    def get_context_data(self, *args, **kwargs):
        context = super(ProfilePage, self).get_context_data(*args, **kwargs)
        user = User.objects.get(username=UserCreation.objects.get(id=self.kwargs.get('pk')))
        print(self.request.user,user,self.kwargs.get('pk'))
        try:
            context['data'] = ProfileData.objects.get( user=user)
            context['userdata'] = User.objects.get( username=user)
            context['creationdata'] = UserCreation.objects.get(user=user)
            context['friends'] = Friends.objects.get( user=self.request.user,added=user)
            context['sorted'] = sorted(chain(AddStatus.objects.filter(user=user), ImageLib.objects.filter(user=user)),
            key=lambda instance: instance.date, reverse=True)
        except ((ProfileData.DoesNotExist as e) or (Friends.DoesNotExistas as f)) :
            if e:
                context['data']= None
            elif f:
            context['friends'] = None
        return context

1 Ответ

1 голос
/ 22 апреля 2019

Да, вы должны использовать две try - except области. На самом деле лучше , а не писать длинные try - except области видимости, поскольку тогда уже неясно, что вызывает исключение. Таким образом, вы можете реализовать это как:

try:
    context['data'] = ProfileData.objects.get( user=user)
except ProfileData.DoesNotExist:
    context['data']= None

context['userdata'] = User.objects.get( username=user)
context['creationdata'] = UserCreation.objects.get( user=user)

try:
    context['friends'] = Friends.objects.get( user=self.request.user,added=user)
except Friends.DoesNotExist:
    context['friends'] = None

context['sorted'] = sorted(
    chain(AddStatus.objects.filter(user=user),
    ImageLib.objects.filter(user=user)),
    key=lambda instance: instance.date, reverse=True
)

В случае, если наличие множественных ProfileData с и т. Д. Не является проблемой, вместо этого можно использовать .first(), который будет возвращать None, если нет строки для возврата:

context['data'] = ProfileData.objects.filter(user=user).first()

context['userdata'] = User.objects.get(username=user)
context['creationdata'] = UserCreation.objects.get(user=user)

context['friends'] = Friends.objects.filter( user=self.request.user,added=user).first()

context['sorted'] = sorted(
    chain(AddStatus.objects.filter(user=user),
    ImageLib.objects.filter(user=user)),
    key=lambda instance: instance.date, reverse=True
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...