简体   繁体   English

在CBV Django中处理多个异常

[英]Handling multiple exceptions in CBV Django

Is there a way I can handle both the exceptions from different models and still pass none as context individually. 有没有一种方法可以处理来自不同模型的两种异常,并且仍然不将其分别作为上下文传递。

Views.py 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

Yes, you should use two try - except scopes. 是的,你应该使用两个try - except范围。 In fact it is better not to write long try - except scopes, since then it is no longer clear what triggers the exception. 实际上,最好不要写长距离try - except作用域,否则就不再清楚触发异常的原因。 So you can implement this like: 因此,您可以像这样实现:

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
)

In case having multiple ProfileData s, etc. is not a problem, you can make use of .first() instead that will return None if there is no row to return: 如果没有多个 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
)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM