2012-06-12 46 views
17

Tìm cách cập nhật dự án của tôi lên phiên bản django mới nhất và thấy rằng lượt xem chung đã thay đổi khá nhiều. Nhìn vào tài liệu tôi thấy rằng họ đã thay đổi tất cả các công cụ chung cho các chế độ xem dựa trên lớp học. Tôi hiểu cách sử dụng cho hầu hết các phần, nhưng tôi bối rối về những gì tôi cần làm khi trả về một số lượng lớn các đối tượng cho một chế độ xem. Url hiện tại có thể trông giống như:Di chuyển từ direct_to_template sang TemplateView mới trong Django

(r'^$', direct_to_template, { 'template': 'index.html', 'extra_context': { 'form': CodeAddForm, 'topStores': get_topStores, 'newsStories': get_dealStories, 'latestCodes': get_latestCode, 'tags':get_topTags, 'bios':get_bios}}, 'index'), 

Làm cách nào để chuyển đổi thứ gì đó tương tự thành các chế độ xem mới này?

Trả lời

29

Generic Views Migration mô tả chế độ xem dựa trên lớp nào sẽ thay thế cái gì. Theo doc, cách duy nhất để truyền extra_context là subclass TemplateView và cung cấp phương thức get_context_data của riêng bạn. Đây là một lớp DirectTemplateView tôi đã đưa ra cho phép extra_context như được thực hiện với direct_to_template.

from django.views.generic import TemplateView 

class DirectTemplateView(TemplateView): 
    extra_context = None 
    def get_context_data(self, **kwargs): 
     context = super(self.__class__, self).get_context_data(**kwargs) 
     if self.extra_context is not None: 
      for key, value in self.extra_context.items(): 
       if callable(value): 
        context[key] = value() 
       else: 
        context[key] = value 
     return context 

Sử dụng lớp này, bạn sẽ thay thế:

(r'^$', direct_to_template, { 'template': 'index.html', 'extra_context': { 
    'form': CodeAddForm, 
    'topStores': get_topStores, 
    'newsStories': get_dealStories, 
    'latestCodes': get_latestCode, 
    'tags':get_topTags, 
    'bios':get_bios 
}}, 'index'), 

với:

(r'^$', DirectTemplateView.as_view(template_name='index.html', extra_context={ 
    'form': CodeAddForm, 
    'topStores': get_topStores, 
    'newsStories': get_dealStories, 
    'latestCodes': get_latestCode, 
    'tags':get_topTags, 
    'bios':get_bios 
}), 'index'), 
+1

nếu tôi đang sử dụng direct_to_template trong một cái nhìn cú pháp cho DirectTemplateView của bạn cho những điều sau đây là gì? trả về direct_to_template (yêu cầu, template = 'template.html', extra_context) – mogga

+0

DirectTemplateView.as_view (template_name = 'template.html', extra_context = extra_context) – Pykler

+0

Tôi đã thử điều này nhưng tôi nhận được lỗi này: 'AttributeError at/ống/data_browse/ đối tượng 'DirectTemplateView' không có thuộc tính 'has_header' Yêu cầu Phương pháp: \t GET URL yêu cầu: \t http: // localhost: 8000/ống/data_browse/ Django Version: \t 1.5.2 Exception Loại: \t AttributeError Giá trị ngoại lệ: \t Đối tượng 'DirectTemplateView' không có thuộc tính 'has_header' Exception Location: \t /Library/Python/2.7/site-packages/django/utils/cache.py trong patch_vary_headers, dòng 142 Python Executable: \t/usr/bin/python Python Version: \t 2.7.2' – mobopro

4

Tôi chạy vào một vấn đề với câu trả lời Pykler bằng cách sử dụng các lớp con DirectTemplateView. Cụ thể, lỗi này:

AttributeError at /pipe/data_browse/ 'DirectTemplateView' object has no attribute 'has_header' Request Method: 
    GET Request URL: http://localhost:8000/pipe/data_browse/ Django Version: 1.5.2 
    Exception Type: AttributeError 
    Exception Value: 'DirectTemplateView' object has no attribute 'has_header' 
    Exception Location: /Library/Python/2.7/site-packages/django/utils/cache.py in patch_vary_headers, line 142 
    Python Executable: /usr/bin/python 
    Python Version: 2.7.2 

gì làm việc cho tôi là để thay đổi bất kỳ dòng như sau:

return direct_to_template(request, 'template.html', {'foo':12, 'bar':13}) 

này:

return render_to_response('template.html', {'foo':12, 'bar':13}, context_instance=RequestContext(request)) 
+0

Nó cho rằng câu trả lời của Pykler trả về một đối tượng xem cho phần mềm trung gian gây ra vấn đề với một số phần mềm trung gian tùy chỉnh, render_to_responce hoặc render hoạt động tương tự như direct_to_template trả về một đối tượng phản hồi. Trong thời gian này có vẻ như một cách tiếp cận tương thích ngược hơn. Điều này cũng làm cho nó siêu đơn giản để nâng cấp Djano lên 1,5 hoặc 1,6 mà không cần phải chuyển đổi tất cả các chế độ xem của bạn thành chế độ xem dựa trên lớp học. – arctelix

Các vấn đề liên quan