سلام دوستان !
من درحال توسعه یک وبسایت پرسش و پاسخ با جنگو هستم!
میخوام بدونم که چطوری میتونم تعداد بازدید های یک پرسش رو محاسبه کنم؟
حتما لازم نیست بگین توی جنگو چطوری پیاده سازی میشه ، فقط کافیه لاجیک ش رو بگین
با تشکر!
@mhyeganeh
این به ذهن خودمم رسید ولی مشکلی ایجاد نمیکنه؟
شاید پاسخ شما همینجا باشد
مثلا چه مشکلی...؟
اگر میخواهید حتما بین تعداد نمایش و تعداد بازدیدکننده تفاوت قائل بشید این تاپیک رو مطالعه کنید.
دقیقا همین بود منظورم!
@mhyeganeh
ممنون
ولی افسوس که پکیجی که معرفی شده واسه لاراوله. پس باید از سشن ها استفاده کنم دیگه...
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
ممنونم ولی استفاده از آی پی کار درستیه؟ آخه آی پی تغییر میکنه!
تشکر میکنم بابت کد ها ، جالب بود