2010-03-13 37 views
20

Hai đoạn đầu tiên của trang này giải thích rằng quan điểm chung có nghĩa vụ phải làm cho cuộc sống của tôi dễ dàng hơn, ít đơn điệu, và làm cho tôi nên hấp dẫn hơn đối với phụ nữ (tôi đã quyết rằng người cuối cùng):Bằng tiếng Anh đơn giản, chế độ xem chung của Django là gì?

https://docs.djangoproject.com/en/1.4/topics/generic-views/

tôi là tất cả để cải thiện cuộc sống của tôi, nhưng quan điểm chung thực sự làm gì? Có vẻ như rất nhiều buzzwords đang được ném xung quanh, điều này gây nhầm lẫn nhiều hơn là họ giải thích.

Chế độ xem chung có tương tự như giàn giáo trong Ruby on Rails không? Điểm bullet cuối cùng trong phần giới thiệu dường như chỉ ra điều này. Đó có phải là một tuyên bố chính xác không?

Trả lời

19

Chế độ xem chung của Django chỉ là chức năng xem (chức năng python cũ thông thường) làm những việc rất phổ biến trong các ứng dụng web.

Tùy thuộc vào loại ứng dụng bạn đang xây dựng, chúng có thể giúp bạn không ghi nhiều lượt xem đơn giản.

Ví dụ, chế độ xem chung direct_to_template chỉ cần hiển thị mẫu với RequestContext (có nghĩa là mẫu có quyền truy cập thông tin về yêu cầu, như người dùng hiện tại, v.v.).

Như một ví dụ đơn giản, bạn có thể đi từ viết những điều như thế này:

# urls.py 
url('^some-url/$', some_view) 

# views.py 
def some_view(request): 
    return render_to_response('template_name.html', context_instance=RequestContext(request)) 

Để chỉ này:

# urls.py 
url('^some-url/$', direct_to_template, {'template': 'template_name.html'}) 

# views.py doesn't need any code for this view anymore 

Ngoài ra còn có những quan điểm chung phức tạp hơn cho những hành động thông thường như "thể hiện một danh sách các mô hình ", hoặc" thêm một mô hình vào db ".

Ngoài ra, vì các chế độ xem chung chỉ là các chức năng, bạn có thể gọi chúng trong các chức năng xem của riêng bạn để thực hiện "hầu hết công việc", khi bạn cần thứ gì đó khác với các trường hợp chung.

+2

Cảm ơn, TM. Họ nên thêm điều này vào tài liệu :). Tôi không hoàn toàn được bán trên quan điểm chung. Ví dụ của bạn liên quan đến direct_to_template không lưu nhiều mã (2 dòng) và bạn vẫn phải chỉ định mẫu theo cách thủ công. Phần xấu là nó làm cho ứng dụng của bạn khó hiểu hơn một chút, bởi vì nó đòi hỏi tôi biết nhiều hơn về Django hơn là cần thiết để hoàn thành nhiệm vụ đơn giản này. – allyourcode

+1

@allyourcode Với chế độ xem phức tạp hơn, bạn đứng để tiết kiệm nhiều mã hơn, tôi đã chọn một ví dụ rất nhanh. Ngoài ra, đối với những chế độ xem hoạt động trên mô hình, chúng sẽ tự động chọn mẫu dựa trên quy ước đặt tên (hoặc nó có thể bị ghi đè nếu bạn không muốn tuân theo quy ước). Xem http://docs.djangoproject.com/en/1.1/ref/generic-views/ để biết thêm ví dụ. Tôi khuyên bạn nên viết một số trong số các lượt xem này từ đầu và sau đó so sánh. Không ai trong số họ là rất lớn và phức tạp, nó chỉ là một điều ít hơn để viết và gỡ lỗi. –

+0

Cảm ơn một lần nữa, TM. Tôi đã xem các tài liệu cho phiên bản phát triển của Django. – allyourcode

2

Để trả lời câu hỏi thứ hai của bạn: không, lượt xem chung không liên quan đến giàn giáo trong RoR. Giàn giáo, như tên cho thấy, giống như tạo mã. Quan điểm chung là cái gì khác.

Cách sử dụng chính của chế độ xem chung là mức thay thế cao hơn của các chức năng cơ bản render_to_response. Đây là cách bạn có thể viết một chế độ xem đơn giản với render_to_response:

def my_view(request): 
    return render_to_response('my_template.html') 

Nhưng điều này rất cơ bản! Ví dụ, mẫu sẽ không có quyền truy cập vào bối cảnh yêu cầu, trừ khi bạn chuyển nó một cách rõ ràng.

tôi như vậy, thích sử dụng một cái nhìn chung thay vì:

def my_view(request): 
    return direct_to_template(request, template='my_template.html') 

Bây giờ bối cảnh yêu cầu sẽ được thông qua ngày! Và đó mới chỉ là một sự khởi đầu. Chế độ xem chung có ích khi bạn muốn hiển thị danh sách hoặc xem chi tiết. Họ sẽ quản lý truy vấn cơ sở dữ liệu và nhắn tin cho người dùng, trong số những người khác.

Chế độ xem chung là các hàm mức cao để giúp bạn tạo phản hồi từ chế độ xem.

+0

Chế độ xem chung có thể liên quan đến việc tạo mã, nhưng chúng dường như đóng vai trò tương tự. Trong một phiên bản cũ của Rails, nó có thể tuyên bố giàn giáo trong một bộ điều khiển (xem trong thuật ngữ Django). Điều này sẽ tự động cung cấp cho bộ điều khiển một loạt các phương thức cho phép người dùng thực hiện các hoạt động CRUD cơ bản trên mô hình tương ứng. – allyourcode

+0

Tôi giả sử bạn có nghĩa là "Chế độ xem chung có thể ** không ** liên quan đến việc tạo mã, nhưng chúng đóng vai trò tương tự". Tôi thà nói rằng xem chung ... giúp tạo ra một phản ứng từ một cái nhìn, như tôi đã nói. Một ứng dụng có thể là cho các hoạt động CRUD. Tuy nhiên, lưu ý rằng bạn vẫn phải viết phần còn lại của mã, vì vậy nó chắc chắn không phải là giàn giáo. Ngoài ra, nó sẽ có ý nghĩa để viết quan điểm chung của riêng bạn, nếu bạn có lặp đi lặp lại trong các sáng tạo phản ứng. –

+0

+1 để đề cập đến cách xem chung có thể được sử dụng trong chức năng của bạn. Esp. gọi chế độ xem 'update_object' làm cho nó tốt nhất trong cả hai thế giới đối với tôi: mã rõ ràng và vẫn ngắn. – vdboor

4

Chế độ xem chung cho phép bạn viết mã ngắn hơn nhiều.

Hãy so sánh:

from django.http import HttpResponse, HttpResponseRedirect, Http404 
from django.shortcuts import render_to_response, get_object_or_404, redirect 
from myapp.models import Context 

def edit(request, item_id): 
    object = get_object_or_404(Context, pk=item_id) 

    if request.method == 'POST': 
     form = ContextForm(request.POST, instance=object) 
     if form.is_valid(): 
      form.save() 
      return redirect('myapp-context-index') 
    else: 
     form = ContextForm(instance=object) 

    return render_to_response("myapp/context/edit.html", {'object': object, 'form': form}) 

với:

from django.core import urlresolvers 
from django.views.generic.create_update import update_object 
from myapp.models import Context 

def edit(request, item_id):  
    return update_object(request, 
     object_id=item_id,    
     form_class=ContextForm,    
     template_name="myapp/context/edit.html", 
     post_save_redirect=urlresolvers.reverse("myapp-context-index") 
    ) 

Giống như quan điểm bình thường của bạn, họ có chức năng chỉ bình thường. Có thể cấu hình khung nhìn hoàn toàn trong URLconf nếu bạn thích, thông qua tôi thấy việc sử dụng này ở trên rõ ràng hơn một chút.

Là một THƯỞNG, bạn cũng có được: kiểm tra xác thực

  • Đăng nhập (vượt qua login_required=True)
  • thông báo trạng thái thành công từ django.contrib.messages.
  • Ít mã hơn để kiểm tra lỗi.
  • Mặc định ModelForm khi bạn cung cấp thông số model thay vì form_class.

template_name có mặc định là "appname/model_form.html", nhưng đó là một chút quá nhiều đối với tôi.


Đây là lớp mẫu họ cả hai phần:

class ContextForm(forms.ModelForm): 
    """The form for a context""" 
    class Meta: 
     model = Context 
     exclude = ('collection',) 

    def save(self, commit=True): 
     """Overwritten save to force collection_id to a value""" 
     model = super(ContextForm, self).save(commit=False) 
     model.collection_id = 1 
     if commit: 
      model.save() 
     return model 
Các vấn đề liên quan