سلام استاد امکانش هست بگید بازدید های اخیر کاربر و بیشترین بازدیدهای کاربر چجوری پیاده سازی میشه؟
سلام وقت بخیر
برای ثبت بازدید از مقاله یا محصول و یا هر مدلی که میخواید یه فیلد به مدل مورد نظرتون اضافه کنید به این شکل :
viewd_count = models.IntegerField(default=0)
که تعداد بازدید رو برای شما ذخیره میکنه و در ادامه میتونید با order_by این فیلد بر اساس پربازدید ترین ها مرتبش کنید.
اگر میخواید با هر بار لود شدن صفحه بازدید ثبت شه مثلا یک صفحه رو رفرش کنید و مجدد بازدید ثبت کنه ، نیازی به ثبت بازدید ها نیست و کافیه توی ویوی مورد نظر بنویسید :
object # instance of your model
object.viewd_count += 1
object.save()
اما اینجوری بازدید فیک میخوره و اهمیت چندانی نداره برای بازدید واقعی تر بهتر هستش یه مدل برای بازدید بسازید و بازدید هارو مثلا بر اساس IP کاربر ثبت کنید
برای دریافت IP کاربر توابع اماده مختلفی هست این یکیشه مثلا که request رو دریافت میکنه و IP رو برمی گردونه :
def get_client_ip(request):
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')
return ip
مدل هم به این شکل میشه مثلا برای بازدید محصول :
class ProductView(models.Model):
user_ip = models.CharField(max_length=100)
product = models.ForeginKey(Product, on_delete=models.SET_NULL, null=True)
create_date = models.DateTimeField(auto_now_add=True)
حالا داخل ویو جزئیات محصول مورد نظر برای ثبت بازدید به این شکل مینویسیم :
product # instance of Product
ip = get_client_ip(request)
if not ProductView.objects.filter(user_ip=ip, product_id=product.id).exists():
ProductView.objects.create(user_ip=ip, product_id=product.id)
product.viewd_count += 1
product.save()
با اینکار میاد چک میکنه اگر IP فعلی از این محصول بازدید کرده بود دیگه بازدید ثبت نمیکنه در غیر این صورت ثبت میکنه
البته باز هم دقیق نیست چون روزانه با فیلترشکن و موارد دیگه بارها IP ما تغییر میکنه و بازدید ثبت میکنه
ولی باز هم خیلی دقیق تر از حالت اول هستش
موفق باشید
خیلی ممنون از توضیح کاملتون درست شد
فقط امکان داره توضیح بدید این تکه کد چی کار میکنه؟
def get_client_ip(request):
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')
return ip
کداش رو متوجه نمیشم
ممنون میشم
استاد من کدم رو این شکلی نوشتم برای پیدا کردن بیشترین بازدید هر کاربر
این خطارو میده میگه به product دسترسی نداره درحالی که من ForeignKey زدم
دلیلیش رو میدونید؟
کدوم قسمت رو میگین دوست من
من خطایی در کدتون نمیبینم
ممنون استاد حل شد
امکانش هست این تکه کدرو توضیح بدید؟
def get_client_ip(request):
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')
return ip
این قطعه کد با استفاده از درخواستی که به سرور ارسال شده، مقدار IP رو برمیگردونه که بتونین ازش استفاده کنین
مممون