9 پاسخ

محاسبه تعداد بازدید یک پست

سلام دوستان !
من درحال توسعه یک وبسایت پرسش و پاسخ با جنگو هستم!
میخوام بدونم که چطوری میتونم تعداد بازدید های یک پرسش رو محاسبه کنم؟
حتما لازم نیست بگین توی جنگو چطوری پیاده سازی میشه ، فقط کافیه لاجیک ش رو بگین
با تشکر!


ثبت پرسش جدید
محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 3 سال پیش مطرح شد
0

اگر بگردید جنگو هم حتما موارد مشابه زیاد داره...

یک کار دیگه هم میشه کرد و اون هم محول کردن این بخش به Google Analytics و بازخونی اطلاعات با استفاده از API ش هست که شاید یکم پیچیده تر باشه فرایندش. ولی در نهایت خروجی جالبی میشه.


محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 3 سال پیش آپدیت شد
0

در ساده‌ترین حالت و روش ممکن:
یک فیلد به جدول پرسش‌هاتون اضافه می‌کنید مثلا بنام viewCount

و بعد هر بار که ریکوئستی برای صفحه ‌single پرسش دریافت کردید در Controller و قبل از نمایش view اون فیلد viewCount رو یک واحد زیاد (increment) می‌کنید.


عبدالرحمان کیانی
تخصص : Backend developer
@abdolrahman 3 سال پیش مطرح شد
0

@mhyeganeh
این به ذهن خودمم رسید ولی مشکلی ایجاد نمیکنه؟


محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 3 سال پیش مطرح شد
0

مثلا چه مشکلی...؟
اگر می‌خواهید حتما بین تعداد نمایش و تعداد بازدیدکننده تفاوت قائل بشید این تاپیک رو مطالعه کنید.


عبدالرحمان کیانی
تخصص : Backend developer
@abdolrahman 3 سال پیش مطرح شد
0

دقیقا همین بود منظورم!
@mhyeganeh
ممنون
ولی افسوس که پکیجی که معرفی شده واسه لاراوله. پس باید از سشن ها استفاده کنم دیگه...


محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 3 سال پیش مطرح شد
0

اگر بگردید جنگو هم حتما موارد مشابه زیاد داره...

یک کار دیگه هم میشه کرد و اون هم محول کردن این بخش به Google Analytics و بازخونی اطلاعات با استفاده از API ش هست که شاید یکم پیچیده تر باشه فرایندش. ولی در نهایت خروجی جالبی میشه.


عبدالرحمان کیانی
تخصص : Backend developer
@abdolrahman 3 سال پیش مطرح شد
0

https://github.com/thornomad/django-hitcount
بله یه پکیج پیدا کردم بنظر خوب میاد
@mhyeganeh


علیرضا کفایتی
تخصص : برنامه نویس laravel, vue.js
@alirezakefayati 3 سال پیش مطرح شد
1

@abdolrahman
دنبال پکیج نباشید خودتون هم میتونید به راحتی پیاده سازی اش کنید .
یک جدول جداگانه با نام visits تعریف کنید و اونجا موارد ip , time , post رو بگیرید . اینجوری هم اون مشکل رو حل می کنید و هم میتونید آمار بازدید رو به صورت روزانه ، ماهانه ، سالانه داشته باشید و به ادمین نمایش بدید .


electera
@electera 3 سال پیش آپدیت شد
0

برای نشون دادن بازدیدهای یونیک براساس ip من از ساختار ماژولار خود جنگو استفاده میکنم و یک اپ درست کردم با نام hits، بدون url و views.py و اونو در پروژوهای مختلف کپی میکنم، اینطوری در بخشهای مختلف پروژه استفاده میشه اما اگر پروژه شما کوچیکه، در همون اپ اصلی کارهای زیر رو انجام بدین:
یک فایل پایتون مثلاً با نام middleware.py در اپ مربوطه ایجاد کنید و این کدها رو برای دریافت IP بازدید کننده قرار بدین:

from .models import IPAddress

class SaveIPAddressMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        # One-time configuration and initialization.

    def __call__(self, request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.
        x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
        if x_forwarded_for:
            ip = x_forwarded_for.split(',')[0]
        else:
            ip = request.META.get('REMOTE_ADDR')

        try:
            ip_address = IPAddress.objects.get(ip_address=ip)
        except IPAddress.DoesNotExist:
            ip_address = IPAddress(ip_address=ip)
            ip_address.save()
        request.user.ip_address = ip_address

        response = self.get_response(request)

        # Code to be executed for each request/response after
        # the view is called.

        return response

در models.py:

from django.db import models

class IPAddress(models.Model):
    ip_address = models.GenericIPAddressField(verbose_name='آدرس IP')
    create = models.DateTimeField(auto_now_add=True, verbose_name='تاریخ بازدید')

    def __str__(self):
        return self.ip_address

    class Meta:
        verbose_name = 'بازدید'
        verbose_name_plural = 'بازدیدها'

حالا در مدلی مثل مقاله ها این جدول رو با کدی شبیه این بسازین:

hits = models.ManyToManyField(IPAddress, through="ArticleHits", blank=True, related_name='hits', verbose_name='بازدیدهای یونیک')

ایمپورت مدل یادتون نره:

from hits.models import IPAddress

حالا برای ثبت ip آدرسها در views.py مقاله اینطوری ذخیره کنید:

def article_detail(request, slug):
    article = get_object_or_404(Article.objects.published(), slug=slug)
    ip_address = request.user.ip_address
    if ip_address not in article.hits.all():
        article.hits.add(ip_address)
    article.save()

    context = {'article': article}
    return render(request, "blog/detail.html", context)

خب دیگه تمومه و در تمپلت مربوطه اینطوری تعداد رو بگیرین و نمایش بدین:

{{ article.hits.count }}

توضیحات این روش رو میتونید در همون ویدئوهای سیلیسیوم یوتیوب ببینید.

اگر خواستید بازدیدها رو جداگانه برای سطح دسترسی مدیرها و نمایش بهتر و... داشته باشید در همان مدل مقاله ها میتونید جدول جدا بسازید:

class ArticleHits(models.Model):
    article = models.ForeignKey(Article, on_delete=models.CASCADE, verbose_name='مقاله')
    ip_address = models.ForeignKey(IPAddress, on_delete=models.CASCADE, verbose_name='آی پی آدرس')
    created = models.DateTimeField(auto_now_add=True, verbose_name='زمان ایجاد')

من تو همین پروژه بازدیدهای کلی و یونیک را باهم دریافت میکنم که دوستان توضیحاتشو دادن و میتونید اینطوری بسازید:
در مدل مقاله:

view = models.ManyToManyField(User, blank=True, related_name='blog_view', verbose_name='کاربرهای بازدید کننده')
    review = models.PositiveIntegerField(default=0, verbose_name='بازدیدها')

در views که کدهای دریافت ip که بالا گفتم هست دیگه خودتون جدا کنید:

def article_detail(request, slug):
    article = get_object_or_404(Article.objects.published(), slug=slug)
    ip_address = request.user.ip_address
    if ip_address not in article.hits.all():
        article.hits.add(ip_address)

    article.review += 1
    article.save()
    if request.user.is_authenticated:
        article.view.add(request.user)

    context = {'article': article}
    return render(request, "blog/detail.html", context)

عبدالرحمان کیانی
تخصص : Backend developer
@abdolrahman 3 سال پیش مطرح شد
0

@electera
ممنونم ولی استفاده از آی پی کار درستیه؟ آخه آی پی تغییر میکنه!
تشکر میکنم بابت کد ها ، جالب بود


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام