2014-02-02 2 views
0

У меня есть много аналогичных функций в моем Django views.py, которые начинаются от так:Как я могу избежать повторения этого общего кода в представлениях Django?

@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, поскольку я набирал один и тот же код столько раз.

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

ответ

0

Вы можете написать декоратор, который получает MyObjectId и slug из представления в качестве параметра. регистрирует информационную строку и вызывает ошибку, если объект отсутствует.

Просто проверьте информацию о декораторах функций и прочитайте код django для примеров. Например, найдите код для декоратора, который вы уже используете (login_required), и найдите декоратор user_passes_test в django.contrib.auth.decorators. Это, наверное, лучший пример для вашего дела.

И затем используйте декоратор перед каждым видом, который ему нужен - точно так же, как вы используете @login_required

Смежные вопросы