2017-06-25 45 views
5

Jak utworzyć zaawansowany formularz wyszukiwania niestandardowego w administratorze Django i wyświetlić listę zmian dla administratorów Django. Mój zaawansowany formularz wyszukiwania ma kilka pól, w tym:Jak utworzyć zaawansowany formularz wyszukiwania niestandardowego w administratorze Django i wyświetlić listę zmian dla administratorów Django

  • regionu
  • miasto
  • prowincja

admin.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',) 

Models.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 
    ) 
+0

Można zastąpić get_queryset metodę filtrowania (https://stackoverflow.com/a/12354293/2474573) i należy zdefiniować metodę changelist_view mowa w Dokumentach (https://docs.djangoproject.com/en/1.11/ref/contrib/admin/#django.contrib.admin.ModelAdmin.changelist_view) –

Odpowiedz

0

Nie jestem pewien, czy chodziło Ci o to, że już napisałeś niestandardowe wyszukiwanie, ale w tym przypadku, w zależności od tego, co chcesz zrobić, możesz tego nie potrzebować. Możesz wyszukiwać w powiązanych polach modelu za pomocą domyślnej wartości search_fields z zastrzeżeniem, że spowoduje to podobne wyszukiwania/łączenia.

jestem, nie wiem, co City, Province i Region wyglądać, ale zakładając, że mają name pole, to powinno działać (jeśli mają pole id, to będzie tylko province__id, itd.):

# admin.py 

class PropertyAdmin(ModelAdmin): 
... 
search_fields = (
    'region__name', 
    'city__name', 
    'province__name', 
) 

Zauważ, że jeśli świadczą o ForeignKeys w list_display, będziesz prawdopodobnie chcesz nadpisać queryset używać select_related na wszelkich polach, aby pokazać, aby uniknąć generowania wiele niepotrzebnych zapytań SQL:

# admin.py 
class PropertyAdmin(ModelAdmin): 
    ... 
    def get_queryset(self, request); 
     qs = super(PropertyAdmin, self).get_queryset(request) 
     return qs.select_related('province', 'city', 'region',) 

P.S. Wygląda również na to, że dwukrotnie zdefiniowałeś list_display_links, więc druga definicja nadpisuje pierwszą, co może nie być pożądanym zachowaniem.

2
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 %}