Django वर्ग-आधारित विचारों में URL-पैरामीटर्स और तर्क (TemplateView)


94

यह मेरे लिए स्पष्ट नहीं है कि Django 1.5 में वर्ग-आधारित विचारों में URL-मापदंडों का उपयोग करना सबसे अच्छा कैसे है।

निम्नलिखित को धयान मे रखते हुए:

राय:

from django.views.generic.base import TemplateView


class Yearly(TemplateView):
    template_name = "calendars/yearly.html"

    current_year = datetime.datetime.now().year
    current_month = datetime.datetime.now().month

    def get_context_data(self, **kwargs):
        context = super(Yearly, self).get_context_data(**kwargs)
        context['current_year'] = self.current_year
        context['current_month'] = self.current_month
        return context

URLCONF:

from .views import Yearly


urlpatterns = patterns('',
    url(
        regex=r'^(?P<year>\d+)/$',
        view=Yearly.as_view(),
        name='yearly-view'
    ),
)

मैं yearअपने दृष्टिकोण में पैरामीटर का उपयोग करना चाहता हूं, इसलिए मैं तर्क कर सकता हूं जैसे:

month_names = [
    "January", "February", "March", "April", 
    "May", "June", "July", "August", 
    "September", "October", "November", "December"
]

for month, month_name in enumerate(month_names, start=1):
    is_current = False
    if year == current_year and month == current_month:
        is_current = True
        months.append({
            'month': month,
            'name': month_name,
            'is_current': is_current
        })

उपर्युक्त की तरह CBVs में url पैरामीटर को कोई सबसे अच्छा उपयोग कैसे करेगा, यह उपवर्गित है TemplateViewऔर जहां किसी को आदर्श रूप से तर्क को इस तरह रखना चाहिए, जैसे। एक विधि में


इसमें सरल extra_contextतानाशाही का विकल्प है django2, यहां
तिमो

जवाबों:


113

वर्ग आधारित विचारों, उपयोग में url पैरामीटर का उपयोग करने के self.argsलिए या self.kwargsतो आप इसे कर से उन तक पहुंच जाएगाself.kwargs['year']


1
क्या यह सही ढंग से समझा गया है कि मैं सीधे दृश्य में वैरिएबल बनाने वाला नहीं हूं जैसे कि मैंने ऊपर देखा है? (उनके बारे में लगातार कुछ किया जा रहा है)। इसके अलावा, मुझे यह समझ में नहीं आता है कि मैं तर्क को ऊपर की तरह स्थान देना चाहता हूँ, जैसे। किस विधि में इसके अलावा जब मुझे लगता year = self.kwargs['year']है कि मुझे मिलता है NameError: self not defined

2
तकनीकी रूप से आपको तब तक नहीं करना चाहिए जब वे कक्षा स्तर पर होते हैं और वर्ग चर होते हैं। के लिए के रूप में NameError, आप कहाँ करने की कोशिश कर रहे हैं year = self.kwargs['year']? आपको इसे एक विधि में करना चाहिए, आप इसे कक्षा के स्तर पर नहीं कर सकते। इसलिए, उदाहरण के लिए, आप एक का उपयोग कर रहे हैं TemplateViewइसका मतलब है कि आप अपने get_context_dataओवरराइड में तर्क करेंगे ।
जन्म 12

4
केवल संदर्भित करने के लिए: स्व.श्रेणी, स्व.आर्ग आदि पर प्रलेखन docs.djangoproject.com/en/1.10/topics/class-based-views/…
LShi

def __init__(self):यदि आप इसे अन्य कार्यों से बाहर एक्सेस करना चाहते हैं, तो भी आप इसे कक्षा में कार्य कर सकते हैं ।
रहमत ज़मां

60

यदि आप URL पैरामीटर इस तरह से पास करते हैं:

http://<my_url>/?order_by=created

आप इसका उपयोग करके वर्ग आधारित दृश्य में पहुँच सकते हैं self.request.GET(न तो इसमें प्रस्तुत किया गया है self.argsऔर न ही self.kwargs):

class MyClassBasedView(ObjectList):
    ...
    def get_queryset(self):
        order_by = self.request.GET.get('order_by') or '-created'
        qs = super(MyClassBasedView, self).get_queryset()
        return qs.order_by(order_by)

4
धन्यवाद! यह मुझे भ्रमित कर रहा है ... मैं उन सामानों को पढ़ता रहता हूं, जिनका अर्थ है कि एचटीटीपी मापदंडों को कवर्स में रखा जाएगा।
फोबोबार्ब्यू

क्या आप MyClassBasedView के सुपरक्लास का get_queryset () दिखा सकते हैं? मैं बस करूंगा qs=<Object>.objects.<method>
टिमो

24

मुझे यह सुरुचिपूर्ण समाधान मिला, और डेजांगो 1.5 या उच्चतर के लिए, जैसा कि यहां बताया गया है :

Django के सामान्य वर्ग आधारित विचार अब स्वचालित रूप से संदर्भ में एक दृश्य चर शामिल करते हैं। यह चर आपके दृश्य ऑब्जेक्ट पर इंगित करता है।

आपके विचारों में:

from django.views.generic.base import TemplateView    

class Yearly(TemplateView):
    template_name = "calendars/yearly.html"
    # Not here 
    current_year = datetime.datetime.now().year
    current_month = datetime.datetime.now().month

    # dispatch is called when the class instance loads
    def dispatch(self, request, *args, **kwargs):
        self.year = kwargs.get('year', "any_default")

    # other code

    # needed to have an HttpResponse
    return super(Yearly, self).dispatch(request, *args, **kwargs)

प्रेषण समाधान इस प्रश्न में पाया गया ।
जैसा कि दृश्य पहले ही टेम्पलेट संदर्भ में पारित हो चुका है, आपको वास्तव में इसके बारे में चिंता करने की आवश्यकता नहीं है। आपकी टेम्पलेट फ़ाइल वार्षिक रूप से। Html में, उन दृश्य विशेषताओं को बस द्वारा एक्सेस करना संभव है:

{{ view.year }}
{{ view.current_year }}
{{ view.current_month }}

आप अपने urlconf को वैसे ही रख सकते हैं ।

यह ध्यान देने योग्य है कि आपके टेम्पलेट के संदर्भ में जानकारी प्राप्त करना get_context_data () को अधिलेखित करता है, इसलिए यह किसी भी तरह django के एक्शन बीन प्रवाह को तोड़ रहा है ।


8

अब तक मैं केवल get_queryset मेथड से इन url पैरामीटर्स को एक्सेस कर पा रहा हूं, हालाँकि मैंने इसे केवल एक ViewView नहीं टेम्पलेट लिस्ट के साथ आज़माया है। मैं ऑब्जेक्ट उदाहरण पर एक विशेषता बनाने के लिए url param का उपयोग करूंगा, फिर संदर्भ को पॉप्युलेट करने के लिए get_context_data में उस विशेषता का उपयोग करें:

class Yearly(TemplateView):
    template_name = "calendars/yearly.html"

    current_year = datetime.datetime.now().year
    current_month = datetime.datetime.now().month

    def get_queryset(self):
        self.year = self.kwargs['year']
        queryset = super(Yearly, self).get_queryset()
        return queryset

    def get_context_data(self, **kwargs):
        context = super(Yearly, self).get_context_data(**kwargs)
        context['current_year'] = self.current_year
        context['current_month'] = self.current_month
        context['year'] = self.year
        return context

मुझे लगता है कि अजीब है, क्या कोई त्रुटि या कुछ है जब आप करने की कोशिश करते हैं context['year'] = self.kwargs['year']? यह कक्षा में कहीं भी सुलभ होना चाहिए।
जन्मदाता

@ जेनरेटर: मैंने अभी डबल चेक करने के लिए एक साफ django प्रोजेक्ट स्थापित किया है और यह पता चला है कि आप सही हैं। मुझे यकीन नहीं है कि मेरे मूल कोड में यह क्या रोक रहा था लेकिन मुझे पता चल जाएगा :)। हेड-अप के लिए धन्यवाद
हेल्सगेट

7

इस समझदारी को बनाने के लिए केवल पायथन डेकोरेटर्स का उपयोग कैसे करें:

class Yearly(TemplateView):

    @property
    def year(self):
       return self.kwargs['year']

मैं यह पसंद है। संपत्ति पुन: प्रयोज्य है।
सीजर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.