2012-04-06 27 views
19

Uygulamalarımdan birinde django.contrib.admin kullanıyorum.Django admin inline

benim modeller:

class Gallery(models.Model): 
    location = models.ForeignKey(Location) 
    date = models.CharField(max_length = 15) 

class Image(models.Model): 
    gallery = models.ForeignKey(Gallery) 
    name = models.CharField(max_length=35) 
    image = ImageField(upload_to='songs') 

benim admin.py: Şimdi bir galeri oluşturmak ve aynı sayfada resimleri ekleyebilirsiniz olduğum yönetici bölümünde

class ImageInline(admin.StackedInline): 
    model   = Image 

class GalleryAdmin(admin.ModelAdmin): 
    inlines = [ ImageInline, ] 

. Varsayılan olarak django, üç resim yükleme formunu gösterir. Bunu sadece bir taneye nasıl değiştirebilirim?

cevap

24

ekstra =

class GalleryImageInline(admin.TabularInline): 
    """ 
    Gallery Image inline 
    """ 
    fieldsets = (
     (
      None, 
      { 
       'fields': ('name', 'image',) 
      } 
     ), 
    ) 

    model = Image 
    extra = 0 


class GalleryAdmin(admin.ModelAdmin): 
    """ 
    Case Study Admin 
    """ 
    fieldsets = (
     (
      None, 
      { 
       'fields': ('location', 'date',) 
      } 
     ), 
    ) 

    inlines = (GalleryImageInline,) 
    list_display = ['location', 'date'] 
    list_filter = ['location', ] 

Ve bence 0, aslında gerek Bu bazı resizey şeyler yapar o sizin gibi olmayabilir - böylece gerekebilir:

from django.contrib.admin.widgets import AdminFileWidget 
from django.utils.translation import ugettext as _ 
from django.utils.safestring import mark_safe 
import os 
import Image 

class AdminImageWidget(AdminFileWidget): 
    def render(self, name, value, attrs=None): 
     output = [] 
     if value and getattr(value, "url", None): 

      image_url = value.url 
      file_name=str(value) 

      # defining the size 
      size='100x100' 
      x, y = [int(x) for x in size.split('x')] 
      try : 
       # defining the filename and the miniature filename 
       filehead, filetail = os.path.split(value.path) 
       basename, format = os.path.splitext(filetail) 
       miniature   = basename + '_' + size + format 
       filename   = value.path 
       miniature_filename = os.path.join(filehead, miniature) 
       filehead, filetail = os.path.split(value.url) 
       miniature_url  = filehead + '/' + miniature 

       # make sure that the thumbnail is a version of the current original sized image 
       if os.path.exists(miniature_filename) and os.path.getmtime(filename) > os.path.getmtime(miniature_filename): 
        os.unlink(miniature_filename) 

       # if the image wasn't already resized, resize it 
       if not os.path.exists(miniature_filename): 
        image = Image.open(filename) 
        image.thumbnail([x, y], Image.ANTIALIAS) 
        try: 
         image.save(miniature_filename, image.format, quality=100, optimize=1) 
        except: 
         image.save(miniature_filename, image.format, quality=100) 

       output.append(u' <div><a href="%s" target="_blank"><img src="%s" alt="%s" /></a></div> %s ' % \ 
       (miniature_url, miniature_url, miniature_filename, _('Change:'))) 
      except: 
       pass 
     output.append(super(AdminFileWidget, self).render(name, value, attrs)) 
     return mark_safe(u''.join(output)) 

not: görüntü inline görüntüler (şimdiye özel resim widget'ı geçersiz) Widget'ın başa boyutlandırma bölümünü kendiniz yazmanız için

öyleyse, satır içi en formda widget'ı geçersiz kılmak için ihtiyacımız olacak: Böyle somethig ile bitirmek

class GalleryImageForm(forms.ModelForm): 
    """ 
    Image Admin Form 
    """ 
    class Meta: 
     model = Image 
     widgets = { 
      'image' : AdminImageWidget, 
     } 

class GalleryImageInline(admin.TabularInline): 
    ... 
    form = GalleryImageForm 
    ... 

ve (bu başka bir projenin parçasıdır ve ekstra şeyler bir grup vardır) : Eğer sorl-thumbnails kullanırsanız durumda screenshot of the image admin inline

5

, widget şu şekildedir:

from django.contrib.admin.widgets import AdminFileWidget 
from django.utils.safestring import mark_safe 
from sorl import thumbnail 


class AdminImageWidget(AdminFileWidget): 
    def render(self, name, value, attrs=None): 
     output = [] 
     if value and getattr(value, "url", None): 
      t = thumbnail.get_thumbnail(value,'100x100') 
      output.append('<img src="{}">'.format(t.url)) 
     output.append(super(AdminFileWidget, self).render(name, value, attrs)) 
     return mark_safe(u''.join(output)) 


class GalleryImageForm(forms.ModelForm): 
    """ 
    Image Admin Form 
    """ 
    class Meta: 
     model = Image 
     widgets = { 
      'image' : AdminImageWidget, 
     } 

class GalleryImageInline(admin.TabularInline): 
    ... 
    form = GalleryImageForm 
    ...