2011-07-29 80 views
2

我想在管理員中顯示選定的圖庫。我不太擅長編寫自定義字段,也找不到任何有關它的有據可查的指導原則。Django中的圖庫預覽管理員

至於我的問題,我已經寫了基本類,如:

class GalleryViewWidget(forms.TextInput): 
    def render(self,name,value,attrs): 
     rendered = super(GalleryViewWidget, self).render(name, value, attrs) 
     return rendered + mark_safe(....) 

class ProductModelForm(forms.ModelForm): 
    information = forms.CharField(widget=forms.Textarea) 
    gallery = GalleryViewWidget 
    class Media: 
     css = { 
      'all': (settings.MEDIA_URL + 'css/preview.css',) 
     } 
     js=(
       "http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", 
       settings.MEDIA_URL + 'js/preview.js', 
      ) 
    class Meta: 
     model = Product 

在我preview.js文件,我想送一個Ajax請求,問題是我不知道在哪裏處理這個Ajax調用。在我的ProductModelForm中?

我真的很感激,如果有人給我任何關於如何處理這個Ajax的事情或另一種方式顯示在我的管理選定的畫廊的知識?

回答

3

在這裏,我看到有點過時的教程... 它創建自己的縮略圖。你需要使用「sorl-thumbnail」現在的縮略圖生成和存儲它更容易,更正確的方式IMHO ...

然而,它是一個教程,如何建立一個照片預覽管理。您可以使用它或通過AJAX調用來增強它。但恕我直言,這再次沒有必要...

P.S.最好從一開始就下載這個應用程序的完整源代碼。

所以......文章:

Django Tutorial: Photo Organizer and Sharing App Part I. Enhancing Admin.

1

小部件(與處理的文件名後綴額外的功能)可能是這樣的:

class ImageThumbnailWidget(forms.FileInput): 

    def __init__(self, postfix=None, attrs={}): 
     self.postfix = postfix 
     super(ImageThumbnailWidget, self).__init__(attrs) 

    def render(self, name, value, attrs=None): 
     output = [] 
     if value and hasattr(value, "url"): 
      img_path = value.url.split('/')[:-1] 
      img_path = "/".join(img_path) 
      img_name = value.url.split('/')[-1] 
      if self.postfix: 
       name_parts = img_name.split(".") 
       ext = name_parts.pop() 
       img_name_start = "_".join(name_parts) 
       img_name = "%s%s.%s" % (img_name_start, self.postfix, ext) 
      output.append('%s<br/><img src="%s/%s" /> <br />%s ' % 
       (_('Currently:'), img_path, img_name, _('Change:'))) 
     output.append(super(ImageThumbnailWidget, self).render(name, value, attrs)) 
     return mark_safe(u''.join(output)) 

希望它能幫助。如果它不符合你的需求,請寫一些更多的細節,我會試着找出一些東西(我想知道你想要在哪裏展示圖庫的預覽 - 是「changelist」還是「change_view」的產品,在那裏你有內聯的圖像集)。

1

我會回答我在哪裏放置Admin/ModelForm Ajax視圖?你的問題的一部分,對於畫廊部分可能看看photologue

至於創建從管理窗體中調用的視圖,我發現創建簡單的自定義視圖是最簡單的。在您的Javascript代碼中,您只需撥打{% url my_ajax_view %},並將數據指定給您的應用。

例如(ajaxy外鍵搜索的修改版本):

class ForeignKeySearchInput(forms.HiddenInput): 
    """ 
    A Widget for displaying ForeignKeys in an autocomplete search input 
    instead in a ``select`` box. 
    """ 
    [ ... stuff removed ... ] 
    def render(self, name, value, attrs=None): 
     [ ... snip ... ] 
     context = Context({ 
      'search_url': reverse('tools_autocomplete_search'), 
      'model_name': self.rel.to._meta.module_name, 
      'app_label': self.rel.to._meta.app_label, 
      [ ... snip ... ] 
     }) 
     template = loader.get_template('admin/widgets/foreignkeysearchinput.html') 
     return rendered + mark_safe(template.render(context)) 

這裏的關鍵是所需要的數據交給widget模板,然後使用該數據來正確調用Ajax回調。

然後,實際視圖與您的問題一樣簡單(或複雜)。

def ajax_search(request): 
    """ 
    Searches in the fields of the given related model and returns the 
    result as a simple string to be used by the jQuery Autocomplete plugin 
    """ 
    query = request.GET.get('q', None) 
    app_label = request.GET.get('app_label', None) 
    model_name = request.GET.get('model_name', None) 
    search_fields = request.GET.get('search_fields', None) 

    [ ... snip ... ] 
    return HttpResponse(simplejson.dumps(data, indent=2)) 

另外,您可以使嵌入AJAX查看到的ModelAdmin子類(或一個mixin),但是如果你不想用django.contrib.admin上述路由內部渣土的是比較容易的方式。