Sök…


Ändra lista

Låt oss säga att du har en enkel myblog app med följande modell:

from django.conf import settings
from django.utils import timezone

class Article(models.Model):
    title = models.CharField(max_length=70)
    slug = models.SlugField(max_length=70, unique=True)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, models.PROTECT)
    date_published = models.DateTimeField(default=timezone.now)
    is_draft = models.BooleanField(default=True)
    content = models.TextField()

Django Admin "ändringslista" är sidan som visar alla objekt i en given modell.

from django.contrib import admin
from myblog.models import Article

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
    pass

Som standard använder den __str__() -metoden (eller __unicode__() om du på python2) för din modell för att visa objektet "namn". Detta innebär att om du inte åsidosätter det kommer du att se en lista med artiklar, alla kallade "Artikelobjekt". För att ändra detta beteende kan du ställa in __str__() :

class Article(models.Model):
    def __str__(self):
        return self.title

Nu bör alla dina artiklar ha ett annat namn och mer tydligt än "Artikelobjekt".

Men du kanske vill visa andra data i den här listan. list_display :

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
    list_display = ['__str__', 'author', 'date_published', 'is_draft']

list_display är inte begränsat till list_display och egenskaper. det kan också vara en metod för din ModelAdmin :

from django.forms.utils import flatatt
from django.urls import reverse
from django.utils.html import format_html

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
    list_display = ['title', 'author_link', 'date_published', 'is_draft']
    
    def author_link(self, obj):
        author = obj.author
        opts = author._meta
        route = '{}_{}_change'.format(opts.app_label, opts.model_name)
        author_edit_url = reverse(route, args=[author.pk])
        return format_html(
            '<a{}>{}</a>', flatatt({'href': author_edit_url}), author.first_name)

    # Set the column name in the change list
    author_link.short_description = "Author"
    # Set the field to use when ordering using this column
    author_link.admin_order_field = 'author__firstname'

Ytterligare CSS-stilar och JS-skript för admin sida

Anta att du har en enkel Customer :

class Customer(models.Model):
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)
    is_premium = models.BooleanField(default=False)

Du registrerar det i Django-administratören och lägger till first_name efter first_name och last_name :

@admin.register(Customer)
class CustomerAdmin(admin.ModelAdmin):
    list_display = ['first_name', 'last_name', 'is_premium']
    search_fields = ['first_name', 'last_name']

När du har gjort detta visas sökfälten på adminlistasidan med standardplatshållaren: " nyckelord ". Men tänk om du vill ändra denna platshållare till " Sök efter namn "?

Du kan göra detta genom att skicka anpassad Javascript-fil till admin Media :

@admin.register(Customer)
class CustomerAdmin(admin.ModelAdmin):
    list_display = ['first_name', 'last_name', 'is_premium']
    search_fields = ['first_name', 'last_name']
    
    class Media:
        #this path may be any you want, 
        #just put it in your static folder
        js = ('js/admin/placeholder.js', )

Du kan använda verktygsfältet för felsökning för webbläsare för att hitta vilken id eller klass Django som ställs in i det här sökfältet och sedan skriva din js-kod:

$(function () {
   $('#searchbar').attr('placeholder', 'Search by name')
})

Även Media klass kan du lägga till CSS-filer med ordlistan objekt:

class Media:
    css = {
        'all': ('css/admin/styles.css',)
         }

Vi måste till exempel visa varje element i first_name kolumnen i specifik färg.
Som standard skapar Django tabellkolumn för varje objekt i list_display , alla <td> -taggar har css-klass som field-'list_display_name' , i vårt fall kommer det field_first_name

.field_first_name {
     background-color: #e6f2ff;
 }

Om du vill anpassa annat beteende genom att lägga till JS eller några css-stilar, kan du alltid kontrollera ID: s och klasser av element i webbläsarens felsökningsverktyg.

Hantera utländska nycklar som hänvisar till stora bord

Som standard ForeignKey Django ForeignKey fält som en <select> -ingång. Detta kan göra att sidor laddas riktigt långsamt om du har tusentals eller tiotusentals poster i den refererade tabellen. Och även om du bara har hundratals poster är det ganska obekvämt att leta efter en viss post bland alla.

En mycket praktisk extern modul för detta är django-autocomplete-light (DAL). Detta gör det möjligt att använda autofyllt fält istället för fält <select> .

django-autocomplete-light-exempel

views.py

from dal import autocomplete

class CityAutocomp(autocomplete.Select2QuerySetView):
    def get_queryset(self):
        qs = City.objects.all()
        if self.q:
            qs = qs.filter(name__istartswith=self.q)
        return qs

urls.py

urlpatterns = [
    url(r'^city-autocomp/$', CityAutocomp.as_view(), name='city-autocomp'),
]

forms.py

from dal import autocomplete

class PlaceForm(forms.ModelForm):
    city = forms.ModelChoiceField(
        queryset=City.objects.all(),
        widget=autocomplete.ModelSelect2(url='city-autocomp')
    )

    class Meta:
        model = Place
        fields = ['__all__']

admin.py

@admin.register(Place)
class PlaceAdmin(admin.ModelAdmin):
    form = PlaceForm


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow