2013-05-29 36 views
5

Trước hết, tôi muốn cả hai chế độ xem đều sử dụng cùng một URL vì tôi không muốn làm cho URLConf phức tạp hơn. Tôi muốn có các khung nhìn riêng cho GET và POST để làm cho mã của tôi sạch hơn. Mã này giống như sau:Cách viết các khung nhìn riêng cho GET và POST

def view2 (request): 
    # handle POST request, possibly a ajax one 
    return HTTPRESPONSE(json_data, mimetype="Application/JSON") 

def view1 (request): 
    if method == POST: 
     view2(request) 
     # What should I return here??? 

    else: 
     # handle GET 
     return render(request, template, context) 

Câu hỏi của tôi là về dòng # What should I return here???. Nếu tôi không đưa trở lại ở đó, lỗi xảy ra:

không trở về http phản ứng

Nhưng tôi đã trả lại một phản ứng HTTP trong View2. Làm thế nào tôi có thể thực hiện công việc này?

+0

Bạn nên 'trở lại view2 (yêu cầu) '. View2 trả về kết quả của người gọi (đó là 'view1'), nhưng người gọi cũng cần trả lại nó. – J0HN

Trả lời

4

Bạn cần phải trả lại kết quả của View2:

def view1 (request): 
    if request.method == 'POST': 
     return view2(request) 
    else: 
     # handle GET 
     return render(request, template, context) 
+0

Aha, cảm ơn bạn! – Philip007

6

Một cách có thể là một chút bụi sẽ được sử dụng class-based views

from django.views.generic import TemplateView 

class View1(TemplateView): 
    def get(self, request, *args, **kwargs): 
     """handle get request here""" 

    def post(self, request, *args, **kwargs): 
     """handle post request here""" 

    def head(self, request, *args, **kwargs): 
     """handle head request here. Yes, you can handle any kind of requests, not just get and post""" 

Tất nhiên bạn có thể thêm các phương pháp thông thường, __init__ (đó là vô dụng trừ khi bạn chắc chắn mình đang làm gì), áp dụng login_required (xem this SO question) và mọi thứ bạn có thể làm với chế độ xem django (ví dụ: áp dụng phần mềm trung gian, quyền, v.v.) các lớp python (ví dụ: thừa kế, metaclasses/trang trí, vv)

Ngoài ra, có một bó toàn bộ chung quan điểm dựa trên lớp đến với Django để giải quyết các tình huống thông thường như trang danh sách, trang chi tiết, chỉnh sửa trang, vv

+1

Tôi thực sự thích câu trả lời này. Nó làm cho mã rất rõ ràng và dễ bảo trì. – Dunatotatos

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