اذهب إلى المحتوى

السؤال

نشر

مرحبا 

ضمن مشروع دجانغو احتاج الى الحصول على موقع المستخدم عند التسجيل (خطوط الطول والعرض ) وحفظها في قاعدة البيانات 

حاولت العمل على PointField() 

class Clinic(Center):

  name_doctor = models.CharField(_("Name_Doctor:"),max_length=50)
  working_hours = models.CharField(_("working_hours:"),max_length=50,unique=False)
  waiting_time = models.IntegerField(_("waiting_time"), unique=True)
  price = models.IntegerField(_("Price is"), unique=True)
  slug = models.SlugField(_("slug")  )
  location = models.PointField()
  
  def save(self, **kwargs):
     if not self.location:
        address = u'%s %s %s %s %s %s' % (self.a2, self.a3, self.a4, self.a5, self.a6, self.pcode)
        address = address.encode('utf-8')
        geocoder = GoogleV3(api_key='My API Key')
        try:
             _, latlon = geocoder.geocode(address, timeout=10)
        except (URLError, ValueError, TypeError):

             pass
        else:
             point = "POINT(%s %s)" % (latlon[1], latlon[0])
             self.location = geos.fromstr(point)
    super(Architect, self).save()

 

هل هذه الطريقة مناسبة ام يوجد طريقة افضل 

Recommended Posts

  • 0
نشر

يمكنك باستعمال الحزمة GeoIP2

from django.shortcuts import render, HttpResponse
from django.contrib.gis.geoip2 import GeoIP2
def home(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')
    
    device_type = ""
    browser_type = ""
    browser_version = ""
    os_type = ""
    os_version = ""
    if request.user_agent.is_mobile:
        device_type = "Mobile"
    if request.user_agent.is_tablet:
        device_type = "Tablet"
    if request.user_agent.is_pc:
        device_type = "PC"
    
    browser_type = request.user_agent.browser.family
    browser_version = request.user_agent.browser.version_string
    os_type = request.user_agent.os.family
    os_version = request.user_agent.os.version_string
    
    g = GeoIP2() # إنشاء كائن من GeoIP2
    location = g.city(ip) # جلب المدينة أو الحداثيات ، حسب ما تريد 
    location_country = location["country_name"]
    location_city = location["city"]
    context = {
        "ip": ip,
        "device_type": device_type,
        "browser_type": browser_type,
        "browser_version": browser_version,
        "os_type":os_type,
        "os_version":os_version,
        "location_country": location_country,
        "location_city": location_city
    }
    return render(request, "home.html", context)

 

  • 0
نشر

مرحبا زينة،

للحصول على موقع مستخدم بطريقة سهلة وبسيطة يمكننا استخدام المكتبة django-ip-geolocation.

لتثبيت المكتبة نستخدم الأمر:

pip install django-ip-geolocation

نقوم بإضافة 'django_ip_geolocation.middleware.IpGeolocationMiddleware' إلى إعدادات ال MIDDLEWARE في ملف الإعدادات settings.py:

MIDDLEWARE = [
    ...
    'django_ip_geolocation.middleware.IpGeolocationMiddleware',
    ...
]

بعدها يمكننا الحصول على إحداثيات المستخدم في دوال العرض views على الشكل التالي:

def api_view(request):
   location = request.geolocation 
   
   
def other_view(request):
  location = request.geolocation
  ...

المكتبة تستخدم عدة واجهات برمجية APIs للحصول على المعلومات منها ماهو مجاني ومنها ماهو مدفوع. يمكنك تغيير الواجهة البرمجية أو انشاء واحدة جديدة من خلال الإعدادات BACKEND.

بالتوفيق.

  • 0
نشر
بتاريخ On 11/9/2022 at 14:21 قال مسعود زاهي:

 

بعدها يمكننا الحصول على إحداثيات المستخدم في دوال العرض views على الشكل التالي:


def api_view(request):
   location = request.geolocation 
   
   
def other_view(request):
  location = request.geolocation
  ...

 

هل يمكن توضيح الفكرة 

كيف يتم حفظها ضمن قاعدة postgresql

  • 0
نشر
بتاريخ منذ ساعة مضت قال Zeina Makdisi:

هل يمكن توضيح الفكرة 

كيف يتم حفظها ضمن قاعدة postgresql

مرحبا مجددا،

بعد تثبيت مكتبة django-ip-geolocation. نقوم بتحديد ال BACKEND الخاص بالمكتبة.

المكتبة توفر لنا استخدام الواجهة البرمجية الخاصة بموقع ipstack وذلك عن طريق استخدام الباكند "django_ip_geolocation.backends.IPStack".

لاستخدام هذا الأخير يستوجب علينا الحصول على API_KEY من موقع ipstack (الموقع لديه صيغة مجانية وصيغ أخرى مدفوعة).

بعد الحصول على ال API_KEY نقوم بتحديث الإعدادات في ملف settings.py:

IP_GEOLOCATION_SETTINGS = {
    'BACKEND': 'django_ip_geolocation.backends.IPStack',
    'BACKEND_API_KEY': '', # هنا نضع ال
                           # API_KEY
                           # لذي حصلنا عليه من موقع
                           # ip stack
}

نستعمل المكتبة في الكود الخاص بنا وبالتحديد في دالة العرض المسؤولة عن حفظ المستخدمين في قاعدة البيانات، نفرض أن دالة العرض هي register:

def register(request):
	# لجلب احداثيات المستخدم نقوم ب
    location = request.geolocation
    latitude = location['geo']['latitude']
    longitude = location['geo']['longitude']
    # لحفظ الاحداثيات في قاعدة البيانات نستخدم الصنف
    # Point
    point = Point(latitude, longitude)
   	
    clinic = Clinic()
    clinic.location = point
    # نضيف المعلومات الأخرى الخاصة بالعيادة
    ....
    ....
    # نقوم بعملية الحفظ
    clinic.save()
    

بالتوفيق.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...