سلام دوستان !
من درحال توسعه یک وبسایت پرسش و پاسخ با جنگو هستم!
میخوام بدونم که چطوری میتونم تعداد بازدید های یک پرسش رو محاسبه کنم؟
حتما لازم نیست بگین توی جنگو چطوری پیاده سازی میشه ، فقط کافیه لاجیک ش رو بگین
با تشکر!
اگر بگردید جنگو هم حتما موارد مشابه زیاد داره...
یک کار دیگه هم میشه کرد و اون هم محول کردن این بخش به Google Analytics و بازخونی اطلاعات با استفاده از API ش هست که شاید یکم پیچیده تر باشه فرایندش. ولی در نهایت خروجی جالبی میشه.
در سادهترین حالت و روش ممکن:
یک فیلد به جدول پرسشهاتون اضافه میکنید مثلا بنام viewCount
و بعد هر بار که ریکوئستی برای صفحه single پرسش دریافت کردید در Controller و قبل از نمایش view اون فیلد viewCount رو یک واحد زیاد (increment) میکنید.
مثلا چه مشکلی...؟
اگر میخواهید حتما بین تعداد نمایش و تعداد بازدیدکننده تفاوت قائل بشید این تاپیک رو مطالعه کنید.
دقیقا همین بود منظورم!
@mhyeganeh
ممنون
ولی افسوس که پکیجی که معرفی شده واسه لاراوله. پس باید از سشن ها استفاده کنم دیگه...
اگر بگردید جنگو هم حتما موارد مشابه زیاد داره...
یک کار دیگه هم میشه کرد و اون هم محول کردن این بخش به Google Analytics و بازخونی اطلاعات با استفاده از API ش هست که شاید یکم پیچیده تر باشه فرایندش. ولی در نهایت خروجی جالبی میشه.
https://github.com/thornomad/django-hitcount
بله یه پکیج پیدا کردم بنظر خوب میاد
@mhyeganeh
@abdolrahman
دنبال پکیج نباشید خودتون هم میتونید به راحتی پیاده سازی اش کنید .
یک جدول جداگانه با نام visits تعریف کنید و اونجا موارد ip , time , post رو بگیرید . اینجوری هم اون مشکل رو حل می کنید و هم میتونید آمار بازدید رو به صورت روزانه ، ماهانه ، سالانه داشته باشید و به ادمین نمایش بدید .
برای نشون دادن بازدیدهای یونیک براساس 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)
@electera
ممنونم ولی استفاده از آی پی کار درستیه؟ آخه آی پی تغییر میکنه!
تشکر میکنم بابت کد ها ، جالب بود
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟