如何避免在Django视图中重复这个常用代码?

时间:2014-02-02 08:51:07

标签: django django-views

我的Django views.py中有很多类似的函数,就像这样开始:

@login_required
def processMyObject(request, myObjectID, myObjectSlug=None):
    logger.info("In processMyObject(myObjectID=%s, myObjectSlug=%s)" % (myObjectID, myObjectSlug))
    try:
        myObject = MyObject.objects.get(id=myObjectID)
    except:
        logger.error("Failed to get MyObject Object by ID")
        raise "Failed to get MyObject Object by ID"

    if myObjectSlug != None and myObject.slug != myObjectSlug:
        logger.error("myObjectSlug '%s' doesn't match myObject #%s's slug" % (myObjectSlug, myObject.id))
        raise "myObjectSlug '%s' doesn't match myObject #%s's slug" % (myObjectSlug, myObject.id)

这些函数中的每一个都具有相同的参数签名,并在顶部包含相同的代码块,但接着继续实现一些独特的功能。然而,这是每个中的常见代码。对于我而言,似乎是一次可怕的违反DRY的行为,因此我多次输入相同的代码。

如何使用继承或其他技术来优雅地分解这些代码,使其只出现一次但在每个视图函数中使用?

1 个答案:

答案 0 :(得分:0)

您可以编写从视图接收MyObjectId和slug作为参数的装饰器。记录信息行,如果缺少对象则引发错误。

只需检查有关函数装饰器的信息,并阅读django代码以获取示例。例如,查找您正在使用的装饰器的代码(login_required)并在django.contrib.auth.decorators中查找user_passes_test装饰器。这可能是您案件的最佳实例。

然后在需要它的每个视图前面使用装饰器 - 就像你使用@login_required一样