【问题标题】:Custom Filter in Django adminDjango admin 中的自定义过滤器
【发布时间】:2018-01-15 19:02:04
【问题描述】:

我有一个模型如下

class Person:
  name = models.CharField()
  city = models.CharField()
  phone = models.CharField()

我想在后台创建一个过滤器,过滤器应该是基于手机的,即

valid phone(having 10 digits)
invalid phone

我不想创建验证。我只是想过滤掉谁拥有有效的电话而无效。 谢谢

【问题讨论】:

  • 您是否在寻找电话号码字段:github.com/stefanfoulis/django-phonenumber-field
  • 或者你可以试试这样的:stackoverflow.com/a/19131360/3848720
  • @BearBrown 我没听懂你。我可以使用“list_filter”创建一个普通过滤器,但这会给我带来全部否定,相反我想自定义过滤器以分别显示有效的电话号码和无效的电话号码。我不想在保存时进行验证。
  • @tdsymonds 我不想进行验证。我只想知道在保存的 no 中哪个有效,哪个无效。我想在管理页面中看到这个过滤器
  • 你需要html模板过滤器吗?

标签: python django filter admin


【解决方案1】:

创建自定义列表过滤器类。有一个example in the docs 可以根据您的情况采用。

from django.contrib import admin

class ValidPhoneListFilter(admin.SimpleListFilter):
    # Human-readable title which will be displayed in the
    # right admin sidebar just above the filter options.
    title = _('valid phone')

    parameter_name = 'valid_phone'

    def lookups(self, request, model_admin):
        return (
            ('valid', _('valid phone')),
            ('invalid', _('invalid phone')),
        )

    def queryset(self, request, queryset):
        if self.value() == 'valid':
            return queryset.filter(phone__regex=r'^\d{10}$')
        if self.value() == 'invalid':
            return queryset.exclude(phone__regex=r'^\d{10}$')

然后在list_filter 中为您的模型管理员包含您的列表过滤器类。

class PersonAdmin(admin.ModelAdmin):
    list_filter = (ValidPhoneListFilter,)

【讨论】:

  • 谢谢,我认为这行得通。让我检查一下,然后再回复你
  • 过滤器出现在右侧,带有有效和无效选项,但过滤器未按计划工作。单击有效将不提供任何值,单击无效将提供所有值。我认为问题出在正则表达式中。请检查一次并告诉我。你的答案是我发现的最接近的
  • 正则表达式对我来说似乎没问题 - import re; re.search(r'^\d{10}$', '0123456789') 返回匹配项。
【解决方案2】:

你可以做类似的事情

from django.core.validators import RegexValidator

phone_regex = RegexValidator(r'^[0-9]{10}$', 'Invalid phone number')

在你的模型中

phone = models.CharField(validators=[phone_regex])

此正则表达式仅检查是否为数字且长度为 10。根据您的具体需要进行修改。

希望这会有所帮助。

祝你好运!

【讨论】:

  • 感谢您的宝贵时间,但我不想放置验证器。我只需要能够以管理员身份过滤掉
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-03
  • 2012-08-19
  • 2010-11-02
  • 2018-10-19
  • 2019-03-17
  • 1970-01-01
相关资源
最近更新 更多