django代码重用整理--摘自django book

来源:互联网 发布:黑马程序员php视频 编辑:程序博客网 时间:2024/06/06 13:03

forloop.counter 总是一个表示当前循环的执行次数的整数计数器。 这个计数器是从1开始的,所以在第一次循环时 forloop.counter 将会被设置为1。

{% for item in todo_list %}    <p>{{ forloop.counter }}: {{ item }}</p>{% endfor %}

forloop.parentloop 是一个指向当前循环的上一级循环的 forloop 对象的引用(在嵌套循环的情况下)。 例子在此:

1

{% for country in countries %}    <table>    {% for city in country.city_list %}        <tr>        <td>Country #{{ forloop.parentloop.counter }}</td>        <td>City #{{ forloop.counter }}</td>        <td>{{ city }}</td>        </tr>    {% endfor %}    </table>{% endfor %}
我们介绍了 render_to_response() 这个快捷方式,它可以简化调用 loader.get_template() ,然后创建一个 Context 对象,最后再调用模板对象的 render()过程


No1第一种

def my_view1(request):    if not request.user.is_authenticated():        return HttpResponseRedirect('/accounts/login/')    # ...    return render_to_response('template1.html')def my_view2(request):    if not request.user.is_authenticated():        return HttpResponseRedirect('/accounts/login/')    # ...    return render_to_response('template2.html')def my_view3(request):    if not request.user.is_authenticated():        return HttpResponseRedirect('/accounts/login/')    # ...    return render_to_response('template3.html')

重复代码为登录验证

修改为

def requires_login(view):    def new_view(request, *args, **kwargs):        if not request.user.is_authenticated():            return HttpResponseRedirect('/accounts/login/')        return view(request, *args, **kwargs)    return new_view

函数requires_login,传入一个视图函数view,然后返回一个新的视图函数new_view.这个新的视图函数new_view在函数requires_login内定义 处理request.user.is_authenticated()这个验证,从而决定是否执行原来的view函数

from django.conf.urls.defaults import *from mysite.views import requires_login, my_view1, my_view2, my_view3urlpatterns = patterns('',    (r'^view1/$', requires_login(my_view1)),    (r'^view2/$', requires_login(my_view2)),    (r'^view3/$', requires_login(my_view3)),)


No2 第二种

比如说,你有两个视图,它们的内容是一致的,除了它们所用的模板不太一样:

# urls.pyfrom django.conf.urls.defaults import *from mysite import viewsurlpatterns = patterns('',    (r'^foo/$', views.foo_view),    (r'^bar/$', views.bar_view),)# views.pyfrom django.shortcuts import render_to_responsefrom mysite.models import MyModeldef foo_view(request):    m_list = MyModel.objects.filter(is_new=True)    return render_to_response('template1.html', {'m_list': m_list})def bar_view(request):    m_list = MyModel.objects.filter(is_new=True)    return render_to_response('template2.html', {'m_list': m_list})

可以修改为

# urls.pyfrom django.conf.urls.defaults import *from mysite import viewsurlpatterns = patterns('',    (r'^foo/$', views.foobar_view, {'template_name': 'template1.html'}),    (r'^bar/$', views.foobar_view, {'template_name': 'template2.html'}),)# views.pyfrom django.shortcuts import render_to_responsefrom mysite.models import MyModeldef foobar_view(request, template_name):    m_list = MyModel.objects.filter(is_new=True)    return render_to_response(template_name, {'m_list': m_list})

第三种

比如这个视图显示一系列的 Event 对象,那个视图显示一系列的 BlogEntry 对象,并意识到它们都是一个用来显示一系列对象的视图的特例,而对象的类型其实就是一个变量。

# urls.pyfrom django.conf.urls.defaults import *from mysite import viewsurlpatterns = patterns('',    (r'^events/$', views.event_list),    (r'^blog/entries/$', views.entry_list),)# views.pyfrom django.shortcuts import render_to_responsefrom mysite.models import Event, BlogEntrydef event_list(request):    obj_list = Event.objects.all()    return render_to_response('mysite/event_list.html', {'event_list': obj_list})def entry_list(request):    obj_list = BlogEntry.objects.all()    return render_to_response('mysite/blogentry_list.html', {'entry_list': obj_list})

可以修改为

# urls.pyfrom django.conf.urls.defaults import *from mysite import models, viewsurlpatterns = patterns('',    (r'^events/$', views.object_list, {'model': models.Event}),    (r'^blog/entries/$', views.object_list, {'model': models.BlogEntry}),)# views.pyfrom django.shortcuts import render_to_responsedef object_list(request, model):    obj_list = model.objects.all()    template_name = 'mysite/%s_list.html' % model.__name__.lower()    return render_to_response(template_name, {'object_list': obj_list})

我们使用 model.__name__.lower() 来决定模板的名字。 每个Python的类都有一个 __name__ 属性返回类名。 这特性在当我们直到运行时刻才知道对象类型的这种情况下很有用。 比如, BlogEntry 类的 __name__就是字符串 'BlogEntry' 。

这个例子与前面的例子稍有不同,我们传递了一个通用的变量名给模板。 当然我们可以轻易的把这个变量名改成 blogentry_list 或者 event_list






0 0
原创粉丝点击