बिना किसी तृतीय पक्ष लाइब्रेरी के अपने ब्लॉग पोस्ट में हिट काउंटर जोड़ने का तरीका खोजने के लिए मेरी खोज में मैंने पाया यह उत्तर StackOverflow पर

हालांकि चूंकि मैं एक Django विशेषज्ञ नहीं हूं, इसलिए मैं यह नहीं समझ सकता कि मेरे विचार से उस मिक्सिन का उपयोग कैसे किया जाए।

यहां बताया गया है कि मेरा मॉडल कैसे परिभाषित किया गया है:

class Post(models.Model):
    STATUS_CHOICES = (('draft', 'Draft'), ('published', 'Published'))
    title = models.CharField(max_length=250)
    slug = models.SlugField(max_length=250, unique_for_date='publish')
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blog_posts')
    body = models.TextField()
    publish = models.DateTimeField(default=timezone.now)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='draft')

और मेरे विचार:

def post_list(request):
    posts = Post.published.all()
    return render(request, 'blog/post/list.html', {'posts': posts})


class PostDetailView(DetailView):
    model = Post
    context_object_name = 'post'

और यहाँ उस उत्तर में दिया गया मिश्रण है:

class BlogPostCounterMixin(object):
    def get_context_data(self, **kwargs):
        context = super(BlogPostCounterMixin, self).get_context_data(**kwargs)
        blog_post_slug = self.kwargs['slug']
        if not blog_post_slug in self.request.session:
            bp = BlogPost.objects.filter(slug=blog_post_slug).update(counter=+1)
            # Insert the slug into the session as the user has seen it
            self.request.session[blog_post_slug] = blog_post_slug
    return context

मैं उपयोगकर्ता से उस उत्तर को प्रदान करने के लिए कहूंगा, लेकिन वह 2 साल से अधिक समय से निष्क्रिय है।

आपकी सहायता की सराहना।

1
Omid Shojaee 13 जुलाई 2021, 13:13

1 उत्तर

सबसे बढ़िया उत्तर

आप अपने मॉडल में IntegerField नाम का views बना सकते हैं

फिर अपने post_detail व्यू में आप इसे रिटर्न स्टेटमेंट से ठीक पहले कर सकते हैं

post.views += 1
post.save(update_fields=['views'])

जाहिर है कि इस समाधान में कुछ विचारों की कमी है जो ठीक उसी क्षण होते हैं जब वे चूक जाते हैं।

संपादित करें:

मिक्सिन का उपयोग करने से पहले आपको पहले एक फ़ंक्शन आधारित दृश्य के बजाय एक वर्ग आधारित दृश्य का उपयोग करना चाहिए फिर आप इस मिक्सिन का उपयोग कर सकते हैं और अपने मामले में आप एक DetailView का उपयोग करना चाहेंगे

https://docs.djangoproject.com/hi/3.2/ref/class-based-views/generic-display/#detailview

class BlogPostCounterMixin:
    def get_object(self, *args, **kwargs):
        # get_object will be available if you use a DetailView
        obj = super().get_object(*args, **kwargs):
        post_unique_key = 'post_%s' % obj.pk # or whatever unique key is
        if not post_unique_key in self.request.session:
            obj.views += 1
            obj.save(update_fields=['views'])
            self.request.session[post_unique_key] = post_unique_key

        return obj

और इस तरह इस्तेमाल किया जा सकता है

class PostDetailView(BlogPostCounterMixin, DetailView):
    model = Post
    context_object_name = 'post'
1
Jameel Hamdan 13 जुलाई 2021, 15:35
धन्यवाद। मैं पूछ रहा हूं कि उस मिक्सिन और मेरे विचार को कैसे एकीकृत किया जाए। मैं कोई अन्य समाधान नहीं ढूंढ रहा हूं।
 – 
Omid Shojaee
13 जुलाई 2021, 13:34
एक बार फिर धन्यवाद। जैसा कि मैंने उल्लेख किया है कि मैं मिश्रण से काफी परिचित नहीं हूं। मेरा सवाल यह है कि इसे "कॉल" कैसे करें - अगर इसे बुलाया जाना चाहिए। मैंने अपना विचार सीबीवी में भी बदल दिया और अपना मूल प्रश्न अपडेट कर दिया।
 – 
Omid Shojaee
13 जुलाई 2021, 15:26
1
आपने अभी-अभी मेरी समस्या का समाधान किया और मुझे यह भी सिखाया कि मिश्रण क्या होता है और इसका उपयोग कैसे किया जाता है। धन्यवाद।
 – 
Omid Shojaee
13 जुलाई 2021, 16:29