내 웹 페이지에서 사용자가 월 및 연도별로 데이터베이스를 필터링하기를 원합니다.
이를 위해 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 %}
감사합니다!
여기 FilterView
에서 search
함수가 아닌을 트리거 하므로 변경 내용에 관계없이 아무것도 변경되지 않습니다. 즉, 여기에서 하위 클래스를 만드는 것이 더 나을 것이라고 생각 합니다 FilterView
.
# app/views.py
from django.contrib.auth.mixins import LoginRequiredMixin
from django_filters.views import FilterView
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/', views.UserDetailsFilterView.as_view(), name='search'),
]
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다