Как сделать фильтрацию в Django
Я хочу сделать фильтрацию в django и хочу сделать это с помощью date_created из custumUser для моего фильтра. Я могу показать date_create с помощью list_display в моей панели администратора, но я не могу фильтровать по ней на странице. мой models.py выглядит так.
class CustomUser(AbstractBaseUser):
email = models.EmailField(max_length=200, unique=True, verbose_name='Email')
username = models.CharField(max_length=150, verbose_name='Username')
first_name = models.CharField(max_length=150, verbose_name='First Name')
last_name = models.CharField(max_length=150, verbose_name='Last Name')
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
date_created = models.DateTimeField(auto_now=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']
objects = UserManager()
def get_full_name(self):
# The user is identified by their email address
return self.email
def get_short_name(self):
# The user is identified by their email address
return self.email
def __str__(self):
return self.email
# this methods are require to login super user from admin panel
def has_perm(self, perm, obj=None):
return self.is_admin
# this methods are require to login super user from admin panel
def has_module_perms(self, app_label):
return self.is_admin
class Meta:
verbose_name = ('user')
verbose_name_plural = ('users')
class EmailConfirmed(models.Model):
user = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
activation_key = models.CharField(max_length=500)
email_confirmed = models.BooleanField(default=False)
date_confirmed = models.DateTimeField(auto_now=True)
def __str__(self):
return self.user.email
class Meta:
verbose_name_plural = 'User Email Confirmed'
@receiver(post_save, sender=CustomUser)
def create_user_email_confirmation(sender, instance, created, **kwargs):
if created:
dt = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
email_confirmed_instance = EmailConfirmed(user=instance)
user_encoded = f'{instance.email}-{dt}'.encode()
activation_key = hashlib.sha224(user_encoded).hexdigest()
email_confirmed_instance.activation_key = activation_key
email_confirmed_instance.save()
и мой admin.py
class UserAdmin(BaseUserAdmin):
add_form = UserCreationForm
form = UserChangeForm
list_display = ('email', 'first_name', 'last_name', 'is_active', 'is_admin', 'is_staff','is_superuser','date_created')
list_filter = ('is_admin', 'is_staff','date_created',)
field_sets = (
(
None, {'fields': ('email', 'first_name', 'last_name', 'password')}
),
(
'Permissions', {'fields': ('is_admin', 'is_staff', 'is_superuser')}
)
)
add_fieldsets = (
(
None, {
'fields': ('email', 'first_name', 'last_name', 'is_active', 'password1', 'password2')
}
),
('Permissions', {'fields': ('is_admin', 'is_superuser')})
)
ordering = ('email',)
search_fields = ('email',)
filter_horizontal = ()
admin.site.register(User, UserAdmin)
class EmailConfirmedAdmin(admin.ModelAdmin):
list_display = ('user', 'first_name', 'last_name', 'date_created', 'email_confirmed', 'date_confirmed')
list_filter = ('email_confirmed', 'date_confirmed', )
def date_created(self, obj):
return obj.user.date_created
def first_name(self, obj):
return obj.user.first_name
def last_name(self, obj):
return obj.user.last_name
admin.site.register(EmailConfirmed, EmailConfirmedAdmin)
И я хочу добавить админ панель для использования фильтрации date_created, которая принадлежит CustomUser Когда я пишу date_created в list_filter я получаю ошибку. Как это можно сделать?
Вам не нужно создавать новый объект, чтобы узнать, когда он был создан. Django по умолчанию предоставляет каждой модели это поле.
Попробуйте это в admin.py:
list_filter = ['created_at']