在Django search_fields

时间:2015-11-27 18:33:42

标签: python django django-admin

我有一个带有ISBN字段的模型。 ISBN(国际标准书号)可以是ISBN10(10位)或ISBN13(13位)。我可以使用自定义功能将10转换为13和13转换为10。 关键是我希望Django在ISBN字段中搜索,无论它是ISBN10还是ISBN13(字段同时接受)。要做到这一点,有必要在某处包含convert函数。例如:如果我的搜索值是8489691207,我希望Django搜索该值并将转换后的值搜索为ISBN13(9788489691209)。

我正在使用Django 1.8和Python 2.7

2 个答案:

答案 0 :(得分:1)

您可以覆盖模型管理员的get_search_results方法。

class BookAdmin(admin.ModelAdmin):
    def get_search_results(self, request, queryset, search_term):
        if is_isbn10(search_term):
            search_term = convert_to_isbn13(search_term)
        queryset, use_distinct = super(BookAdmin, self).get_search_results(request, queryset, search_term)

self.model.objects.filter(年龄= search_term_as_int)             return queryset,use_distinct

答案 1 :(得分:1)

根据Alasdair的回答(谢谢):

from django.db.models import Q
from isbnlib import get_isbnlike, is_isbn10, is_isbn13, to_isbn10, to_isbn13

class Question_Admin(admin.ModelAdmin):
    def get_search_results(self, request, queryset, search_term):
        queryset, use_distinct = super(Question_Admin, self).get_search_results(request, queryset, search_term)
        isbn = get_isbnlike(search_term, level='normal')
        if isbn:
            if is_isbn10(isbn[0]):
                converted = to_isbn13(isbn[0])
            else:
                converted = to_isbn10(isbn[0])
            queryset |= self.model.objects.filter(Q(isbn=isbn[0]) | Q(isbn=converted))
        return queryset, use_distinct