首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Django 1.10中两个不同的基于类的视图中重构相似的外观功能?

如何在Django 1.10中两个不同的基于类的视图中重构相似的外观功能?
EN

Stack Overflow用户
提问于 2016-12-29 06:01:46
回答 1查看 204关注 0票数 1

我使用代码转换,它抱怨说,我在两个不同的基于类的视图中有两个函数,它们太相似了。

附件是代码转换错误。

以下是突出显示的守则:

代码语言:javascript
复制
class PalletContentPickup(APIView):
    """
    Picking up a pallet content to transfer to exiting pallet content
    """
    def put(self, request, pk):
        count = request.data['count']
        pallet_id = request.data['pallet_id']
        from_pallet_content = QuickFind.get_pallet_content_or_404(pallet_content_id=pk)
        to_pallet = QuickFind.get_pallet_or_404(pallet_id=pallet_id)

        Transfer.validate_if_can_pickup_pallet_content(from_pallet_content, to_pallet, request.user)

        to_pallet_content = QuickFind.get_or_create_pallet_content(pallet=to_pallet, product=from_pallet_content.product)
        ExitFormHelper.create_exit_form_line_item_on_pallet_content_if_no_exit_form_line(to_pallet_content, request.user)
        Transfer.previous_pallet_content_to_new_pallet_content(from_pallet_content, to_pallet_content, count)

        serializer = PalletSerializer(from_pallet_content.pallet)
        return Response({"data": serializer.data}, status=status.HTTP_202_ACCEPTED)


class PalletContentPutback(APIView):
    """
    Put back pallet content to an approved pallet
    """
    def put(self, request, pk):
        count = request.data['count']
        pallet_id = request.data['pallet_id']
        from_pallet_content = QuickFind.get_pallet_content_or_404(pallet_content_id=pk)
        to_pallet = QuickFind.get_pallet_or_404(pallet_id=pallet_id)

        Transfer.validate_if_can_putback_pallet_content(from_pallet_content, to_pallet, request.user)

        to_pallet_content = QuickFind.get_or_create_pallet_content(pallet=to_pallet, product=from_pallet_content.product)
        ExitFormHelper.create_exit_form_line_item_on_pallet_content_if_no_exit_form_line(to_pallet_content, request.user)
        Transfer.previous_pallet_content_to_new_pallet_content(from_pallet_content, to_pallet_content, count)

        serializer = PalletSerializer(from_pallet_content.pallet)
        return Response({"data": serializer.data}, status=status.HTTP_202_ACCEPTED)

我读过关于Python中的策略模式的文章

不确定我是否应该在这里应用策略模式,如果应该的话,如何应用?因为url中的示例仍然不能帮助我准确地认识到如何在这里执行策略模式。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-29 06:43:14

在我看来,这两个类之间只有一行不同之处。所以你可以让它变得很简单

代码语言:javascript
复制
class PalletContent(object):
    """
    Put back pallet content to an approved pallet
    """
    def do_action(self, request, pk, action):
        count = request.data['count']
        pallet_id = request.data['pallet_id']
        from_pallet_content = QuickFind.get_pallet_content_or_404(pallet_content_id=pk)
        to_pallet = QuickFind.get_pallet_or_404(pallet_id=pallet_id)

        if action == 'putback':
            Transfer.validate_if_can_putback_pallet_content(from_pallet_content, to_pallet, request.user)
        else:
            Transfer.validate_if_can_pickup_pallet_content(from_pallet_content, to_pallet, request.user)

        to_pallet_content = QuickFind.get_or_create_pallet_content(pallet=to_pallet, product=from_pallet_content.product)
        ExitFormHelper.create_exit_form_line_item_on_pallet_content_if_no_exit_form_line(to_pallet_content, request.user)
        Transfer.previous_pallet_content_to_new_pallet_content(from_pallet_content, to_pallet_content, count)

        serializer = PalletSerializer(from_pallet_content.pallet)
        return Response({"data": serializer.data}, status=status.HTTP_202_ACCEPTED)

class PalletContentPickup(APIView, PalletContent):
     def put(self,request,pk):
         self.do_action(request,pk,'pickup')

class PalletContentPutback(APIView, PalletContent):
     def put(self,request,pk):
         self.do_action(request,pk,'putback')

您只保存了几行代码,但在维护方面可能是值得的。同时,您的验证方法似乎没有返回任何内容。他们是在提出例外吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41373966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档