आम तौर पर, मैं कुछ प्रारंभिक चर सेट करने या उपयोगकर्ता की अनुमतियों के आधार पर कुछ तर्क जोड़ने के लिए कक्षा आधारित दृश्य की dispatch
विधि का उपयोग करता हूं।Django: mixins और प्रेषण विधि के साथ एक वर्ग आधारित दृश्य
उदाहरण के लिए,
from django.views.generic import FormView
from braces.views import LoginRequiredMixin
class GenerateReportView(LoginRequiredMixin, FormView):
template_name = 'reporting/reporting_form.html'
form_class = ReportForm
def get_form(self, form_class):
form = form_class(**self.get_form_kwargs())
if not self.request.user.is_superuser:
form.fields['report_type'].choices = [
choice for choice in form.fields['report_type'].choices
if choice[0] != INVOICE_REPORT
]
return form
यह उम्मीद के रूप में काम करता है: एक अनाम उपयोगकर्ता एक पृष्ठों पर आता है, LoginRequiredMixin की dispatch
विधि कहा जाता है, और फिर लॉगिन पृष्ठ पर रीडायरेक्ट।
लेकिन मैं कुछ अनुमतियों,
class GenerateReportView(LoginRequiredMixin, FormView):
def dispatch(self, *args, **kwargs):
if not (
self.request.user.is_superuser or
self.request.user.is_manager
):
raise Http404
return super(GenerateReportView, self).dispatch(*args, **kwargs)
कुछ मामलों में यह काम नहीं करता है में
, इस दृश्य के लिए जोड़ सकते हैं या कुछ प्रारंभिक चर निर्धारित करते हैं, उदाहरण के लिए करना चाहते हैं क्योंकि mixins के dispatch
तरीकों, का मानना है कि विरासत, अभी तक नहीं बुलाया गया है। तो, उदाहरण के लिए, उपयोगकर्ता की अनुमति के लिए पूछने के लिए सक्षम होने के लिए, मैं LoginRequiredMixin
से मान्यता दोहराना:
class GenerateReportView(LoginRequiredMixin, FormView):
def dispatch(self, *args, **kwargs):
if self.request.user.is_authenticated() and not (
self.request.user.is_superuser or
self.request.user.is_manager
):
raise Http404
return super(GenerateReportView, self).dispatch(*args, **kwargs)
यह उदाहरण के लिए सरल है, लेकिन कभी कभी वहाँ एक मिश्रण में कुछ और अधिक जटिल तर्क हैं: इसके लिए जाँच करता है अनुमतियां, कुछ गणना करता है और इसे कक्षा विशेषता आदि में संग्रहीत करता है।
अभी के लिए मैं इसे मिश्रण से कुछ कोड कॉपी करके (ऊपर दिए गए उदाहरण की तरह) या dispatch
दृश्य से कोड कॉपी करके इसे हल करता हूं किसी अन्य मिश्रण के लिए और उसे पहले क्रम में निष्पादित करने के बाद इसे विरासत में मिला (जो कि सुंदर नहीं है, क्योंकि यह नया मिश्रण केवल एक दृश्य द्वारा उपयोग किया जाता है)।
क्या इस तरह की समस्याओं को हल करने का कोई उचित तरीका है?
पहले कॉल 'सुपर (जेनरेट रिपोर्टपोर्ट, स्वयं)। डिस्पैच (* args, ** kwargs) ''। तो प्रेषण के अंदर शेष नौकरी करें जो आप –
@MihaiZamfir ओवरराइड कर रहे हैं यह काम नहीं करेगा क्योंकि, उदाहरण के लिए, 'LoginRequiredMixin''' 'HttpResponseRedirect'' ऑब्जेक्ट देता है, इसलिए यदि हम इसे एक चर में संग्रहीत करते हैं, तो यह जब तक हम '' प्रेषण' विधि के अंत में इस चर को वापस नहीं करते हैं, तब तक लॉगिन दृश्य पर रीडायरेक्ट नहीं करेंगे। – vero4ka
लेकिन आप जांच सकते हैं कि प्रतिक्रिया एक रीडायरेक्ट है या नहीं, तो प्रेषण –