জাজানো ক্লাস-ভিত্তিক ভিউগুলিতে ইউআরএল-প্যারামিটার এবং যুক্তি (টেমপ্লেটভিউ)


97

জাঙ্গো 1.5 তে ক্লাস-ভিত্তিক-ভিউগুলিতে URL- পরামিতিগুলি অ্যাক্সেস করা কীভাবে সেরা তা আমার পক্ষে অস্পষ্ট uncle

নিম্নোক্ত বিবেচনা কর:

দেখুন:

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
        })

উপরোক্ত শ্রেণীর মতো উপরের মতো সিবিভিগুলিতে ইউআরএল প্যারামিটারে কীভাবে একজনের অ্যাক্সেস পাওয়া যায় TemplateViewএবং যেখানে আদর্শভাবে এইরকম যুক্তি রাখা উচিত, যেমন। কোন পদ্ধতিতে?


সরল extra_contextডিকের বিকল্প রয়েছে django2, এখানে দেখুন
টিমো

উত্তর:


117

শ্রেণিভিত্তিক দর্শনগুলিতে ইউআরএল প্যারামিটারগুলি অ্যাক্সেস করতে, ব্যবহার করুন self.argsবা self.kwargsতাই করে আপনি এটিকে অ্যাক্সেস করবেনself.kwargs['year']


4
এটা কি সঠিকভাবে বোঝা গেছে যে আমার উপরে যেমন মত রয়েছে তেমন ভেরিয়েবল তৈরি করার কথা নয়? (তাদের অবিচল থাকার বিষয়ে কিছু)। উপরের মতো লজিকটি কোথায় রাখার কথা তাও আমি বুঝতে পারি না। কোন পদ্ধতিতে? এছাড়াও আমি যখন year = self.kwargs['year']ভিউ করি তখনই পাই NameError: self not defined

4
প্রযুক্তিগতভাবে আপনার হওয়া উচিত নয় যেহেতু তারা ক্লাস স্তরে এবং শ্রেণি ভেরিয়েবল। হিসাবে NameError, আপনি কি করতে চেষ্টা করছেন year = self.kwargs['year']? আপনার এটি কোনও পদ্ধতিতে করা উচিত, আপনি এটি ক্লাস পর্যায়ে করতে পারবেন না। সুতরাং উদাহরণস্বরূপ, আপনি একটি ব্যবহার করছেন TemplateViewযার অর্থ আপনি নিজের get_context_dataওভাররাইডে যুক্তিটি করবেন ।
নেজেনেটর

4
কেবল রেফারেন্সিংয়ের জন্য: স্ব.আরকোয়েস্ট, সেলফার্গস ইত্যাদির ডকুমেন্টেশনগুলি ডকস.ডজ্যাঙ্গোপ্রজেক্ট /en/1.10 / টপিক্স / ক্লাস- বেসড
ভিউস /

এছাড়াও আপনি def __init__(self):ক্লাসে ফাংশনে এটি করতে পারেন যদি আপনি অন্যান্য ফাংশনের বাইরে এটি অ্যাক্সেস করতে চান।
রাহাত জামান

61

আপনি যদি এই জাতীয় 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
ধন্যবাদ! এটি আমাকে বিভ্রান্ত করছে ... আমি এমন স্টাফগুলি পড়তে থাকি যা বোঝায় যে এইচটিটিপি প্যারামিটারগুলি কাওয়ারগুলিতে থাকবে।
foobarbecue

আপনি কি মাইক্লাসবেসডভিউয়ের সুপারক্লাসের get_queryset () দেখাতে পারেন? আমি কেবল করব qs=<Object>.objects.<method>
টিমো

24

আমি এই মার্জিত সমাধানটি খুঁজে পেয়েছি, এবং জ্যাঙ্গো 1.5 বা তার চেয়েও বেশি এর জন্য এখানে উল্লেখ করেছি :

জ্যাঙ্গোর জেনেরিক শ্রেণিভিত্তিক দর্শনগুলি এখন স্বয়ংক্রিয়ভাবে প্রসঙ্গে একটি দর্শন পরিবর্তনশীলকে অন্তর্ভুক্ত করে। আপনার ভিউ অবজেক্টে এই পরিবর্তনশীল পয়েন্টগুলি।

আপনার ভিউপি-তে:

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)

এই প্রশ্নে প্রেরণের সমাধান পাওয়া গেছে ।
যেহেতু ভিউটি ইতিমধ্যে টেমপ্লেট প্রসঙ্গে passedুকে গেছে তাই আপনার সত্যিকারের চিন্তা করার দরকার নেই। বার্ষিক html আপনার টেম্পলেট ফাইলটিতে, এই দৃশ্যগুলির বৈশিষ্ট্যগুলি সহজেই অ্যাক্সেস করা সম্ভব:

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

আপনি আপনার urlconf ঠিক তেমন রাখতে পারেন ।

এটি উল্লেখযোগ্য যে আপনার টেমপ্লেটের প্রসঙ্গে তথ্য প্রাপ্তি get_context_data () কে ওভাররাইট করে, সুতরাং এটি কোনওভাবে জাঙ্গোর ক্রিয়া বিন স্রোত ভঙ্গ করে ।


8

এখনও আমি get_queryset পদ্ধতির মধ্যে থেকে এই url প্যারামিটারগুলি কেবল অ্যাক্সেস করতে সক্ষম হয়েছি, যদিও আমি এটি কেবলমাত্র তালিকা-ভিউয়ের সাথে টেম্পলেটভিউ নয় চেষ্টা করেছি। আমি অবজেক্টের উদাহরণগুলিতে একটি অ্যাট্রিবিউট তৈরি করতে url পরম ব্যবহার করব, তারপরে প্রসঙ্গটি তৈরি করতে 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']? এটি ক্লাসের যে কোনও জায়গায় অ্যাক্সেসযোগ্য হওয়া উচিত।
নেজেনেটর

@ জেনারেটর: ডাবল চেক করার জন্য আমি কেবল একটি পরিষ্কার জ্যাঙ্গো প্রকল্প স্থাপন করেছি এবং এটি প্রমাণ করে যে আপনি সঠিক। আমি নিশ্চিত না যে এটি আমার আসল কোডটিতে কী প্রতিরোধ করছে তবে আমি তা খুঁজে বের করব :)। মাথা উঁচু করার জন্য ধন্যবাদ
হেলসগেট

7

এই স্বল্পদৈর্ঘ্য করতে কীভাবে পাইথন সাজসজ্জার ব্যবহার করবেন:

class Yearly(TemplateView):

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

আমার এটা ভাল লেগেছে. সম্পত্তি পুনরায় ব্যবহারযোগ্য।
cezar
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.