python - 我如何在 django admin 中创建高级自定义搜索表单并使用 django admins 更改列表显示

标签 python django django-forms django-admin

如何在 Django admin 中创建高级自定义搜索表单并使用 Django admins 更改列表显示。我的高级搜索表单有几个字段,包括:

  • 地区
  • 城市
  • 省份

管理.py:

class PropertyAdmin(ModelAdmin):
    change_list_template = "property/admin/property_change_list.html"
    list_per_page = 20
    list_display_links = ('property_country_province_city',)
    search_fields = ('id',)
    list_filter = ('is_sale','is_rent','is_presales','estate_type','water')
    list_display_links = ('property_type',)

模型.py

class Property(models.Model):
    objects = PublicPropertyManager()
    title = models.CharField(_("title"), max_length = 80, blank=True)
    country = models.ForeignKey(Country, verbose_name=_("Country"))
    province = models.ForeignKey(Province, verbose_name=_("Province"))
    city = models.ForeignKey(City, verbose_name=_("City"))
    region = models.ForeignKey(Region, verbose_name=_("Region"))
    address = models.CharField(
        verbose_name=_("address"), max_length = 250, blank=True, null=True
    )

最佳答案

class CandidateAdmin(admin.ModelAdmin):
    formfield_overrides = {
        models.TextField: {'widget': Textarea(attrs={'rows': 4, 'cols': 40})},
    }
    list_display = ('id', 'first_name', 'last_name', 'current_company',
                    'title', 'gender', 'country', 'status', 'consultant',
                    'mobile_number', 'civil_reg_number', 'added_date')
    list_display_links = ('id', 'first_name', 'last_name')
    list_filter = ('consultant', 'status', 'gender', 'country', 'city')
    form = CandidateForm
    advanced_search_form = AdvancedSearchForm()
    other_search_fields = {}
    search_fields = ['first_name', 'last_name', 'civil_reg_number',
                     'status', 'cvmn', 'cven',
                     'address', 'mobile_number', 'notes']
    actions = [recruited_by_scc]

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == 'consultant':
            kwargs['initial'] = Consultant.objects.get(user=request.user)
            return db_field.formfield(**kwargs)
        return super(CandidateAdmin, self).\
            formfield_for_foreignkey(db_field, request, **kwargs)

    def changelist_view(self, request, extra_context=None, **kwargs):
        extra_context = {'asf':self.advanced_search_form}
        request.POST._mutable=True
        post_keys = []
        search_keys = []
        for key in request.POST.keys():
            value=request.POST.get(key)
            if value!='' and key!='csrfmiddlewaretoken':
                post_keys.append(key)
        for key in self.other_search_fields.keys():
            value = [x for x in self.other_search_fields.get(key) if x!='']
            if value:
                search_keys.append(key)
        if post_keys!=search_keys and len(post_keys)>0 and len(search_keys)>0:
            self.other_search_fields = {}
        for key in self.advanced_search_form.fields.keys():
            try:
                temp = request.POST.pop(key)
            except KeyError:
                pass
            else:
                if temp!=['']:
                    self.other_search_fields[key] = temp
        request.session[request.user.username] = self.other_search_fields
        self.other_search_fields = {}
        request.POST._mutable=False
        return super(CandidateAdmin, self).changelist_view(request, extra_context=extra_context)

    def queryset(self, request):
        qs = super(CandidateAdmin, self).queryset(request)
        search_query = []
        #self.other_search_fields = request.session[request.user.username]
        if request.session[request.user.username]:
            other_search_fields = request.session[request.user.username]
            for key in other_search_fields.keys():
                key_values = other_search_fields.get(key)
                key_values =[value for value in key_values if value!='']
                if key_values:
                    questions = [('{0}__icontains'.format(key), value) for value in key_values]
                    q_list = [Q(x) for x in questions]
                    query = reduce(operator.or_, q_list)
                    search_query.append(query)
            if search_query:
                make_query = reduce(operator.and_, search_query)
                return qs.filter(make_query)
        return qs

admin/search_form.html

   {% load i18n grp_tags %}
    {% if cl.search_fields %}
        <!-- Search Form -->
        {% if asf %}
        <form action="" method="POST"> {% csrf_token %}
            {{asf}}
            <input type="submit" value="search" />
        </form>
        {% else %}
         <!-- Search Form -->
         <form id="grp-changelist-search" action="" method="get">
             <input type="text" name="{{ search_var }}" id="grp-changelist-search" class="grp-search-field" value="{{ cl.query }}" />
             <button type="submit" value="" class="grp-search-button"></button>
             {% for pair in cl.params.items %}
                 {% ifnotequal pair.0 search_var %}<input type="hidden" name="{{ pair.0 }}" value="{{ pair.1 }}"/>{% endifnotequal %}
             {% endfor %}
         </form>
        {% endif %}
    {% endif %}

关于python - 我如何在 django admin 中创建高级自定义搜索表单并使用 django admins 更改列表显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44745793/

相关文章:

python - 如何使用selenium选择单选按钮

javascript - python - 在网络服务中以字节形式发送 pdf

Python 打开文件——你不需要文件的完整路径吗?

python - 仅将唯一对象插入列表

Django : set default value for formset_factory form element

django init 函数在 Form 中带有 attrs

python - 如何从 Django 注册表单中的密码字段获取纯密码

python - GroupBy - 如何使用 diff() 从 DateTime 中提取秒数

python - 在创建实例时创建配置文件模型

python - 我在 django 中不断收到以下错误 : "UnboundLocalError at/myapp/"