Django: фильтр базы данных для текущего пользователя - PullRequest
1 голос
/ 24 февраля 2020

На моей веб-странице я бы хотел, чтобы пользователь фильтровал базу данных по месяцам и годам.

Для этого я создал filters.py.

Моя проблема: я не управлял пользователем, чтобы фильтровать только его собственные данные, но он также может видеть данные других пользователей.

До сих пор я пытался использовать @login_required и метод objects.filter (user = self.request.user). Оба не решили мою проблему.

Буду благодарен за любые чаевые!

Вот мой код:

models.py:

from django.db import models
from django.contrib.auth.models import User

class UserDetails(models.Model):
   user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="new_spending", null=True) 
   expense_name = models.CharField(max_length=255)
   cost = models.FloatField()
   date_added = models.DateTimeField()

filters.py

from .models import UserDetails
import django_filters

class BudgetFilter(django_filters.FilterSet):
    year_added = django_filters.NumberFilter(field_name='date_added', lookup_expr='year', label='Year   [yyyy]')# lookup_expr='year',
    month_added = django_filters.NumberFilter(field_name='date_added', lookup_expr='month', label='Month [mm]')
    class Meta:
        model = UserDetails
        fields = ['year_added', 'month_added']

views.py

from django.shortcuts import render
from .models import UserDetails
from .filters import BudgetFilter
from django.contrib.auth.decorators import login_required

@login_required
def search(request):

    lista = UserDetails.objects.filter(user= request.user)
    filtered_list = BudgetFilter(request.GET, queryset=lista)
    return render(request, 'budget_app/user_list.html', {
        'filter': filtered_list,
        'users': lista
        })

urls.py:

from django.urls import path
from . import views 
from django_filters.views import FilterView
from .filters import BudgetFilter

urlpatterns = [
     ...
     path('search/', FilterView.as_view(filterset_class=BudgetFilter,
        template_name='budget_app/user_list.html'), name='search'),
     ]

html файл:

{% extends 'budget_app/budget_base.html' %}



{% block content %}
  <form method="get">
    {{ filter.form.as_p }}
    <button type="submit">Search</button>
  </form>
  <ul>
  {% for item in filter.qs %}

    <li>{{ item.title }} - {{ item.date_added }}</li>
  {% endfor %}
  </ul>
{% endblock %}

Спасибо!

1 Ответ

0 голосов
/ 24 февраля 2020

Здесь вы запускаете FilterView, а не функцию search, следовательно, независимо от того, что вы изменяете, это ничего не изменит. При этом, я думаю, что здесь может быть лучше подкласс FilterView:

# app/views.py

from django.contrib.auth.mixins import LoginRequiredMixin
from django_filters.views import <b>FilterView</b>
from .models import UserDetails

class UserDetailsFilterView(FilterView):
    filterset_class=BudgetFilter
    template_name='budget_app/user_list.html'

    def get_queryset(self):
        return UserDetails.objects.filter(user=self.request.user)

Тогда в urls.py вы можете просто использовать UserDetailsFilterView:

# app/urls.py

from django.urls import path
from . import views

urlpatterns = [
     ...
     path('search/', <b>views.UserDetailsFilterView.as_view()</b>, name='search'),
]
...