Django Фильтрация между датами

Я создаю фильтр в heatmap, где фильтр будет извлекать только дату от и до даты транзакции. Я не уверен в кодах даты фильтра, но я не получал ошибки, она только поднимается вверх страницы. Мой HTML для даты - MM/DD/YYYY. Не уверен, что это поможет. Но как я могу встроить фильтр между датами? Спасибо

Виды

def index_map(request):

if request.method == "POST":
    fromdate = request.POST.get('fromdate')
    todate = request.POST.get('todate')
    df = pd.DataFrame(IncidentGeneral.objects.filter(user_report__date__date__range=(fromdate, todate)).values('user_report__latitude', 'user_report__longitude', 'accident_factor'))
    print(df)

# coordenadas = list(IncidentGeneral.objects.values_list('user_report__latitude','user_report__longitude'))[-1]    
    map1 = folium.Map(location=[14.676208, 121.043861],
                    zoom_start=12, 
            )

    # df = df.dropna(axis=0, subset=['user_report__latitude', 'user_report__longitude', 'accident_factor', 'user_report__date'])
    # mapquestopen
    

    fg3=folium.FeatureGroup(name='Map with Markers', show=True)
    map1.add_child(fg3)

    # marker_cluster = MarkerCluster().add_to(fg)
    folium.TileLayer(('openstreetmap'), attr='openstreetmap').add_to(map1)
    # folium.TileLayer('mapquestopen', attr='mapquestopen').add_to(map1)
    # folium.TileLayer('MapQuest Open Aerial', attr='MapQuest Open Aerial').add_to(map1)
    folium.TileLayer('cartodbpositron', attr='cartodbpositron').add_to(map1)
    folium.TileLayer('cartodbdark_matter', attr='cartodbdark_matter').add_to(map1)
    plugins.Fullscreen(position='topright').add_to(map1)
    folium.LayerControl().add_to(map1)
    


    for id,row in df.iterrows():
        folium.Marker(location=[row['user_report__latitude'],row['user_report__longitude']], icon=folium.Icon(icon="car", prefix='fa') ,popup=row['accident_factor']).add_to(fg3)
    # folium.Marker(coordenadas).add_to(map1)
    
    # df['user_report__date'] = df['user_report__date'].sort_values(ascending=True)
    # data = []
    # for _, d in df.groupby('user_report__date'):
    #     data.append([[row['user_report__latitude'], row['user_report__longitude'], row['accident_factor']] for _, row in d.iterrows()])

    map1 = map1._repr_html_()
context = {
    'map1': map1
}
return render(request, 'index1.html', context)

Виды

class UserReport(models.Model):
PENDING = 1
APPROVED = 2
REJECTED = 3
STATUS = (
    (PENDING, 'Pending'),
    (APPROVED, 'Approved'),
    (REJECTED, 'Rejected')
)


user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
description = models.TextField(max_length=250, blank=True)
address = models.CharField(max_length=250)
country = models.CharField(max_length=50, blank=True, null=True)
state = models.CharField(max_length=50, blank=True, null=True)
city = models.CharField(max_length=50, blank=True, null=True)
pin_code = models.CharField(max_length=6, blank=True, null=True)
latitude = models.FloatField(max_length=20, blank=True, null=True)
longitude = models.FloatField(max_length=20, blank=True, null=True)
upload_photovideo = models.FileField(upload_to='incident_report/image', blank=True, null=True)
date = models.DateField(auto_now_add=False, auto_now=False, blank=True, null=True)
time = models.TimeField(auto_now_add=False, auto_now=False, blank=True, null=True)
status = models.PositiveSmallIntegerField(choices=STATUS, blank=True, null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

def get_status(self):
    if self.status == 1:
        incident_status = 'Pending'
    elif self.status == 2:
        incident_status = 'Approved'
    elif self.status == 3:
        incident_status = 'Rejected'
    return incident_status

def save(self, *args, **kwargs):
    super(UserReport, self).save(*args, **kwargs)
    if self.upload_photovideo:
        if  ".jpg" in self.upload_photovideo.url or ".png" in self.upload_photovideo.url:
         #check if image exists before resize
            img = Image.open(self.upload_photovideo.path)

            if img.height > 1080 or img.width > 1920:
                new_height = 720
                new_width = int(new_height / img.height * img.width)
                img = img.resize((new_width, new_height))
                img.save(self.upload_photovideo.path)

HTML

Я не понимаю, что значит перейти к началу страницы. Можете поделиться с нами скриншотом, пожалуйста

Я предполагаю, что вы имеете в виду, что вы хотите фильтровать ваши объекты на основе дат to и from. В этом случае можно использовать поиск по диапазону, как вы и делаете, но проблема в том, что вы используете поле date из пользовательского отчета вместо created_at, которое у вас есть в модели UserReport.

def index_map(request):

if request.method == "POST":
    fromdate = request.POST.get('fromdate')
    todate = request.POST.get('todate')
    df = pd.DataFrame(IncidentGeneral.objects.filter(user_report__created_at__date__range=(fromdate, todate)).values('user_report__latitude', 'user_report__longitude', 'accident_factor'))
    print(df)

# coordenadas = list(IncidentGeneral.objects.values_list('user_report__latitude','user_report__longitude'))[-1]    
    map1 = folium.Map(location=[14.676208, 121.043861],
                    zoom_start=12, 
            )

    # df = df.dropna(axis=0, subset=['user_report__latitude', 'user_report__longitude', 'accident_factor', 'user_report__date'])
    # mapquestopen
    

    fg3=folium.FeatureGroup(name='Map with Markers', show=True)
    map1.add_child(fg3)

Вы также можете сделать:

df = pd.DataFrame(IncidentGeneral.objects.filter(user_report__created_at__date__gte=fromdate, user_report__created_at__date__lte=todate).values('user_report__latitude', 'user_report__longitude', 'accident_factor'))
Вернуться на верх