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ả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
@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. –
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