【问题标题】:I have 2 views that have identical post methods, what is the best way to remain DRY我有 2 个具有相同发布方法的视图,保持 DRY 的最佳方法是什么
【发布时间】:2021-02-13 16:05:19
【问题描述】:

我有一个房地产网站,有 2 个单独页面的 2 个视图。每个页面都有一个表单,可让您编辑交易详情。其中一个页面还允许您执行其他需要 post 方法的操作。

所以视图基本上是这样的:

class ViewOne(ListView):
    # ...
    def post(self, request, *args, **kwargs):
        # update transaction logic


class ViewTwo(ListView):
    # ...
    def post(self, request, *args, **kwargs):
        # update transaction logic
        # additional post logic

在不编写重复代码的情况下,将更新事务的发布逻辑添加到每个视图的最佳方法是什么?

【问题讨论】:

    标签: django django-views


    【解决方案1】:

    这个问题可以通过使用 Mixin 来解决。

    mixin 是一个类,它定义并实现了一个单一的、良好定义的 特征。从 mixin 继承的子类继承 this 功能——仅此而已。

    class TransactionLogicMixin:
        def update_transaction(self):
            # your transaction code goes here.
            
    
    class ViewOne(ListView,TransactionLogicMixin):
        # ...
        def post(self, request, *args, **kwargs):
            # update transaction logic
            self.update_transaction()
    
    
    class ViewTwo(ListView,TransactionLogicMixin):
        # ...
        def post(self, request, *args, **kwargs):
            # update transaction logic
            self.update_transaction()
            # additional post logic
    

    【讨论】:

      【解决方案2】:

      如果您愿意,您可以创建一个由每个 POST 请求调用的通用函数,您可以轻松地在其他请求中进行测试和重用。

      例如

      class ViewOne(ListView):
          # ...
          def post(self, request, *args, **kwargs):
              my_beautiful_def(request, foo_bar)
      
      
      class ViewTwo(ListView):
          # ...
          def post(self, request, *args, **kwargs):
              my_beautiful_def(request, foo_bar)
              # additional post logic
      
      def my_beautiful_def(request, foo_bar):
          # do something amazing
          return foo
      

      【讨论】:

        猜你喜欢
        • 2020-09-27
        • 2022-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多