জাজানো ক্লাস-ভিত্তিক ভিউ: as_view পদ্ধতিতে আমি কীভাবে অতিরিক্ত পরামিতিগুলি পার করব?


98

আমার একটি কাস্টম শ্রেণিবদ্ধ ভিউ আছে

# myapp/views.py
from django.views.generic import *

class MyView(DetailView):
    template_name = 'detail.html'
    model = MyModel

    def get_object(self, queryset=None):
        return queryset.get(slug=self.slug)

আমি এটির মতো স্লাগ প্যারামিটারে (বা অন্য প্যারামিটারগুলিতে) পাস করতে চাই

MyView.as_view(slug='hello_world')

এটি করতে সক্ষম হওয়ার জন্য আমার কি কোনও পদ্ধতি ওভাররাইড করা দরকার?

উত্তর:


114

যদি আপনার urlconf এর কিছু দেখতে লাগে:

url(r'^(?P<slug>[a-zA-Z0-9-]+)/$', MyView.as_view(), name = 'my_named_view')

তাহলে স্লাগটি আপনার ভিউ ফাংশনগুলির মধ্যে (যেমন 'get_queryset') এর মতো পাওয়া যাবে:

self.kwargs['slug']

18
এটি একটি self.kwargs.get('slug', None)
alচ্ছিক

6
শুধু কৌতূহল, কখন / কোথায় এই "সেল্ফ.কওয়ার্স" জনবহুল? আমি বেস শ্রেণীর ফাংশনটি সন্ধান করছি যেখানে এটি সেট করা আছে।
বিনিথব

ইন github.com/django/django/blob/master/django/views/generic/... মধ্যেclass View: def as_view(cls, **initkwargs): def view(request, *args, **kwargs):
অ্যাপোলো ডেটা

প্রশ্নের উত্তর দিচ্ছি না।
কীর্তি কে

এই পদ্ধতিটি এখন অবহিত করা হয়েছে, এখন আপনি ব্যবহার করতে পারেনurl('<slug:slug>', MyView.as_view(), name='my_named_view')
রাহাত জামান

93

as_viewপদ্ধতিতে পাস হওয়া প্রতিটি প্যারামিটারটি ভিউ ক্লাসের একটি উদাহরণ ভেরিয়েবল। এর অর্থ slugপ্যারামিটার হিসাবে যুক্ত করার জন্য আপনাকে এটিকে আপনার উপ-শ্রেণিতে উদাহরণ ভেরিয়েবল হিসাবে তৈরি করতে হবে:

# myapp/views.py
from django.views.generic import DetailView

class MyView(DetailView):
    template_name = 'detail.html'
    model = MyModel
    # additional parameters
    slug = None

    def get_object(self, queryset=None):
        return queryset.get(slug=self.slug)

এটি MyView.as_view(slug='hello_world')কাজ করা উচিত ।

যদি আপনি কীওয়ার্ডগুলির মাধ্যমে ভেরিয়েবলগুলি অতিক্রম করে থাকেন তবে মিঃ এরিকসন যা প্রস্তাব করেছিলেন তা ব্যবহার করুন: https://stackoverflow.com/a/11494666/9903


4
কখনই করবেন না import *। আপনার পোস্ট সম্পাদনা।
holms

ভবিষ্যতের পাঠকদের আলোকিত করার জন্য @ হোমস, পিইপি 8 বলেছেন "ওয়াইল্ডকার্ড আমদানি (<মডুল> আমদানি থেকে ) এড়ানো উচিত"। যতটা প্রয়োজন ততটা শক্তিশালী না হওয়া উচিত এবং এটি একটি উদাহরণ তবে হ্যাঁ অবশ্যই * ওয়াইল্ডকার্ড আমদানি এড়ানো উচিত : পাইথন.আর

কিছুই কোথাও আবশ্যক নয়, আমরা আমাদের যেভাবে চাই তা কিছু ভেঙে ফেলতে পারি, তবে পেপ 8 হ'ল অনুশীলনের সুপারিশ, এবং অজগর সম্প্রদায়ের মধ্যে আরও সমস্যাগুলি এড়াতে এই সমস্ত অনুশীলনকে যথাসম্ভব ব্যবহার করার অঙ্গীকারের নিয়ম। আমার কোডটি কমিট করার সময় আমার লিটারারটি সর্বদা খালি থাকে :) যাই হোক না কেন।
হোমস

একটি আসল ভেরিয়েবলের জন্য স্লাগ = 'হ্যালো_ওয়ার্ল্ড' এর মান কী?
18:14 2:

19

আপনি get_object()কীওয়ার্ড আরগ হিসাবে পাস করা স্লাগের উপর ভিত্তি করে কোনও বিষয় সন্ধান করার জন্য আপনাকে ওভাররাইড করার দরকার নেই - আপনি https://docs.djangoproject.com/en/1.5/ref/ এর বৈশিষ্ট্যগুলি ব্যবহার করতে পারেন SingleObjectMixin শ্রেণিভিত্তিক মতামত / মিশ্রণ-একক-অবজেক্ট / # এককোবজেক্টমিক্সিন

# views.py
class MyView(DetailView):
    model = MyModel
    slug_field = 'slug_field_name'
    slug_url_kwarg = 'model_slug'
    context_object_name = 'my_model'

# urls.py
url(r'^(?P<model_slug>[\w-]+)/$', MyView.as_view(), name = 'my_named_view')

# mymodel_detail.html
{{ my_model.slug_field_name }}

(উভয় slug_fieldএবং slug_url_kwargডিফল্ট এ 'slug')


4
আমি কি আমার উত্তরটি উইকি উত্তরে পরিণত করব এবং এতে আপনার কোড যুক্ত করব?

15

আপনি যদি টেমপ্লেটের জন্য প্রসঙ্গে কোনও অবজেক্ট যুক্ত করতে চান তবে আপনি ওভাররাইড করতে পারেন get_context_dataএবং এর প্রসঙ্গে যুক্ত করতে পারেন । অনুরোধ এছাড়াও একটি অংশ স্ব ক্ষেত্রে আপনার যা দরকার request.user

def get_context_data(self, **kwargs):
        context = super(MyTemplateView, self).get_context_data(**kwargs)
        if 'slug' in self.kwargs:
            context['object'] = get_object_or_404(MyObject, slug=self.kwargs['slug'])
            context['objects'] = get_objects_by_user(self.request.user)

        return context


13

আপনি urls.py https://docs.djangoproject.com/en/1.7/topics/http/urls/#passing-extra-options-to-view-funtions থেকে প্যারামিটারগুলি পাস করতে পারেন

এটি জেনেরিক দৃষ্টিভঙ্গির জন্যও কাজ করে। উদাহরণ:

url(r'^$', views.SectionView.as_view(), { 'pk': 'homepage', 'another_param':'?'}, name='main_page'),

এই ক্ষেত্রে দৃশ্যে পাস হওয়া প্যারামিটারগুলি অগত্যা ভিউ বর্গের উদাহরণ ভেরিয়েবল হওয়া উচিত নয়। এই পদ্ধতিটি ব্যবহার করে আপনার ডিফল্ট পৃষ্ঠার নামটি আপনার ভিউ মডেলটিতে হার্ডকোড করার দরকার নেই, তবে আপনি এটি urlconf থেকে প্যারামিটার হিসাবে পাস করতে পারেন।


7

দ্বারা হিসাবে বলেন Yaroslav Nikitenko , যদি আপনি দেখুন ক্লাসে নতুন ইনস্ট্যান্স পরিবর্তনশীল হার্ডকোড চাই না, আপনি পারেন ফাংশন দেখতে অতিরিক্ত অপশন প্রেরণ থেকে urls.pyভালো:

url(r'^$', YourView.as_view(), {'slug': 'hello_world'}, name='page_name')

আমি কেবল ভিউ থেকে এটি কীভাবে ব্যবহার করব তা যুক্ত করতে চেয়েছিলাম। আপনি নিম্নলিখিত পদ্ধতির একটি প্রয়োগ করতে পারেন:

# If slug is optional
def the_function(self, request, slug=None):
    # use slug here

# if slug is an optional param among others
def the_function(self, request, **kwargs):
    slug = kwargs.get("slug", None)
    other_param = kwargs.get("other_param", None)

# If slug is required
def the_function(self, request, slug):
    # use slug here

4
আমি ইয়ারোস্লাভ নিকিতেনকো এর উত্তরে এটি সম্পাদনা করতে চেয়েছিলাম , কিন্তু এটি প্রত্যাখ্যান করা হয়েছিল, তাই আমি নিজের তৈরি করেছি কারণ আমার যখন মনে হয়েছিল যে এটি যখন প্রয়োজন তখন আমার অনুপস্থিত তথ্য ছিল।
এমিল বার্গারন

@ ইয়ারোস্লাভনিকিটেনকো পূর্ববর্তী সময়ে, এটি সম্পাদনার পক্ষে খুব বড় এবং নতুন উত্তর আকারে উত্তর হিসাবে সেরা।
এমিল বার্গারন

@ এমিলিবার্গারন প্রাথমিক প্রশ্নটি DetailViewক্লাসের মতো জেনেরিক দৃষ্টিভঙ্গি সম্পর্কে ছিল । আপনি কীভাবে এটি সেখানে ব্যবহার করবেন তা ব্যাখ্যা করতে পারেন?
বারটায়েলটারম্যান

3

জাঙ্গো 3.0 এর জন্য, এটি আমার পক্ষে কাজ করেছে:

# myapp/views.py
from django.views.generic import DetailView

class MyView(DetailView):
    template_name = 'detail.html'
    slug = None

    def get_object(self, queryset=None):
        self.slug = self.kwargs.get('slug', None)
        return queryset.get(slug=self.slug)

# myapp/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('slug/<slug:slug>/', views.MyView.as_view(), name='myview_by_tag'),
]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.