2013-02-19 46 views
20

Tôi đang cố gọi một lớp dựa trên chế độ xem và tôi có thể làm điều đó, nhưng vì một lý do nào đó tôi không nhận được bối cảnh của lớp mới mà tôi đang gọiChế độ xem dựa trên Lớp gọi điện thoại Django từ chế độ xem lớp khác

class ShowAppsView(LoginRequiredMixin, CurrentUserIdMixin, TemplateView): 
    template_name = "accounts/thing.html" 



    @method_decorator(csrf_exempt) 
    def dispatch(self, *args, **kwargs): 
     return super(ShowAppsView, self).dispatch(*args, **kwargs) 

    def get(self, request, username, **kwargs): 
     u = get_object_or_404(User, pk=self.current_user_id(request)) 

     if u.username == username: 
      cities_list=City.objects.filter(user_id__exact=self.current_user_id(request)).order_by('-kms') 
      allcategories = Category.objects.all() 
      allcities = City.objects.all() 
      rating_list = Rating.objects.filter(user=u) 
      totalMiles = 0 
      for city in cities_list: 
       totalMiles = totalMiles + city.kms 

     return self.render_to_response({'totalMiles': totalMiles , 'cities_list':cities_list,'rating_list':rating_list,'allcities' : allcities, 'allcategories':allcategories}) 


class ManageAppView(LoginRequiredMixin, CheckTokenMixin, CurrentUserIdMixin,TemplateView): 
    template_name = "accounts/thing.html" 

    def compute_context(self, request, username): 
     #some logic here       
     if u.username == username: 
      if request.GET.get('action') == 'delete': 
       #some logic here and then: 
       ShowAppsView.as_view()(request,username) 

Tôi đang làm gì sai?

+1

gì được này phải được thực hiện? Bạn đang hy vọng đạt được điều gì bằng cách đơn giản gọi cái nhìn đó? Tôi đoán bạn có thể cần phải trả lại kết quả của việc gọi nó, nhưng vì 'compute_context' là một phương pháp không chuẩn nên thật khó để chắc chắn. –

+0

Tôi là loại "làm mới" trang của tôi vì vậy tôi đang nhớ lại trang trước của mình với một số dữ liệu ngữ cảnh mới – psychok7

+0

tôi đang trả lại self.render_to_response (self.compute_context (yêu cầu, tên người dùng)) – psychok7

Trả lời

38

Thay vì

ShowAppsView.as_view()(self.request) 

tôi phải làm điều này

return ShowAppsView.as_view()(self.request) 
+4

Tôi thấy rằng nếu bạn thực hiện ShowAppsView.as_view() (yêu cầu, * args, ** kwargs) thực sự có thể nhận được args và kwargs thông qua phương thức get_context_data với ContextMixin, nơi chúng xuất hiện dưới dạng tự .args và self.kwargs. Điều này rất hữu ích cho việc ghi đè phương thức này và thêm vào ngữ cảnh cho một biểu mẫu. – Sven

+0

Tôi thấy điều này cũng hữu ích trong các chế độ xem chức năng. Đó là với mã trên tôi có thể gọi lớp dựa trên quan điểm từ chức năng xem. –

1

Mọi thứ trở nên phức tạp hơn khi bạn bắt đầu sử dụng multiple inheritance trong python để bạn có thể dễ dàng chà đạp bối cảnh của mình với ngữ cảnh đó từ một bản mixin được kế thừa.

Bạn không hoàn toàn cho biết bạn đang nhận được bối cảnh nào và bạn muốn xác định bối cảnh mới nào, vì vậy rất khó chẩn đoán hoàn toàn, nhưng hãy thử sắp xếp lại thứ tự các bản mix của bạn;

class ShowAppsView(LoginRequiredMixin, CurrentUserIdMixin, TemplateView): 

này ngụ ý rằng LoginRequiredMixin sẽ là lớp học đầu tiên để kế thừa từ, và vì vậy nó sẽ được ưu tiên hơn những người khác nếu nó có thuộc tính mà bạn đang tìm kiếm - nếu nó có không thì trăn sẽ tìm trong CurrentUserIdMixin và cứ tiếp tục như vậy.

Nếu bạn muốn được thực sự chắc chắn rằng bạn sẽ có được bối cảnh mà bạn đang sau, bạn có thể thêm ghi đè như

def get_context(self, request): 
    super(<my desired context mixin>), self).get_context(request) 

để đảm bảo rằng bối cảnh mà bạn nhận được là một trong những từ mà bạn mixin muốn.

* Chỉnh sửa * tôi không biết nơi bạn đã tìm thấy compute_context nhưng nó không phải là một thuộc tính django như vậy sẽ chỉ được gọi từ ShowAppsView.get() và không bao giờ trong ManageAppView.

+0

i chỉnh sửa mã của tôi ở trên và lấy ra các compute_context nhưng nó vẫn không hoạt động. Tôi có nên kế thừa ManageAppView từ ShowAppSview để truy cập vào phương thức này không? – psychok7

+0

ditto @Daniel Roseman Nếu 'compute_context' là thứ bạn muốn trả lại, bạn sẽ cần đến nó. Nó không chuẩn, vì vậy có lẽ phải nằm trong 'get_context' hoặc tương tự. Tôi đã không cung cấp một sửa chữa hoàn chỉnh, nhưng một con đường cho thăm dò/điều tra. – danodonovan

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