【问题标题】:Django common code in views视图中的 Django 常用代码
【发布时间】:2011-06-12 13:15:23
【问题描述】:

我一直在阅读其他答案,但我仍然不明白将通用代码用于多个视图的最快和最好的方法是什么。

假设我有这段代码,它反映了用户的观点,我想在许多视图中显示。

if(request.user.is_authenticated()):
    # UserLove
    userLove = 0
    ul = Love.objects.filter(user=request.user.id)
    for u in ul:
        userLove += u.amount
else:
    userLove= 0

我看到了有关使用装饰器的文字。听说过泛型视图和子类视图,还有人提到context processors

你能告诉我哪个最好吗?如果我有 View1 和 View2 作为示例,我的代码会是什么样子。谢谢!

【问题讨论】:

    标签: django django-views


    【解决方案1】:

    不确定我是否同意装饰器或模板标签是这里的最佳方法。装饰器应用于函数(即视图),例如,如果您想确保用户在访问视图之前已登录,您可以使用装饰器。但不适用于确定函数内部的值。

    如果您有一段代码要在多个地方重复使用,只需将其设为单独的函数,可能在 utilities 文件中,然后导入功能。例如:

    # myapps.utilities.py
    from models import Love
    def computeLove(request):
        # code for determining value here
        return LoveValue
    
    # someView.py
    from myapps.utilities import computeLove
    
    def showRatings(request):
        lv = computeLove(request)
    

    这是一种标准的编程方法,您实际上不需要任何特定的 Django 功能。

    【讨论】:

    • 我就是这样做的,效果很好。然而,困扰我的是来自docs.djangoproject.com/en/dev/topics/class-based-viewsPrior to Django 1.3, generic views were implemented as functions. The function-based implementation has been deprecated in favor of the class-based approach described here.
    • @mgPePe,这里涉及到两个不同的东西——一个视图和一个通用代码块。视图只是一个接受请求对象并返回某种 HTTP 响应的函数。无论是作为独立函数实现还是作为类的一部分实现,都与通用代码块的实现方式无关。
    【解决方案2】:

    好的,可能你还需要别的东西,但在你的情况下,你可以使用模板标签来做这件事,例如:

    在 appname/util.py 中,您必须编写返回所需数据的代码部分。 然后在模板标签中你做类似的事情

    # appname_tags.py
    from django import template
    from appname.util import get_rating
    
    register = template.Library()
    
    @register.simple_tag
    def user_rating(user):
        rating = get_rating(user)
        return rating if rating is not None else ''
    

    所以在你的模板文件中:

    {% load appname_tags %}
    
    {% user_rating anyuser %}
    

    【讨论】:

      【解决方案3】:

      为此,编写Template Context ProcessorTemplate Tag 是最好的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-07
        • 1970-01-01
        • 1970-01-01
        • 2016-03-22
        • 1970-01-01
        • 2019-07-12
        相关资源
        最近更新 更多