2011-07-29 14 views
2

管理者に選択したギャラリーを表示します。私はカスタムフィールドを書くことはあまりできませんし、それについて十分に文書化されたガイドラインを見つけることができませんでした。私の質問については、私のような基本的なクラス書いたDjango管理者のギャラリーのプレビュー

:私のpreview.jsファイルで

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 

を、私はAJAXリクエストを送信したい、問題は、私はどこに知らないですこのajax呼び出しを処理します。私のProductModelFormでは?

誰かが私の管理者に選択されたギャラリーを表示するこのAjaxのやり方や別の方法を処理する方法に関する知識を私に与えたら、本当に感謝していますか?

答えて

3

ここで私はそれについての古くなったチュートリアルを見た... それはあなた自身のサムネイルを作成します。サムネイルの生成と保存には今すぐ "sorl-thumbnail"を使用する必要があります...

それでもadminの写真プレビューを作成する方法のチュートリアルです。 AJAX呼び出しでそれを使用することも、拡張することもできます。しかし、IMHO再び必要はありません...

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)) 

はそれがお役に立てば幸いです。それがあなたのニーズに合っていない場合は、詳細を書いてみて、何かを見つけようとします(私はギャラリーのプレビューを正確に表示したい場所を知りたいです - それは "チェンジリスト"か "change_view"製品のインラインフォームセットがある場合)。

1

私はAdmin/ModelForm Ajaxビューをどこに配置しますか?あなたの質問の一部、ギャラリーの部分のためにおそらくphotologueを見てください。

管理フォームから呼び出されたビューを作成する場合、簡単なカスタムビューを最も簡単に作成できることがわかりました。あなたのJavascriptコードでは、あなたのアプリに固有のデータで{% url my_ajax_view %}と呼ぶだけです。例えば

(ajaxy ForeignKeyの検索の修正バージョン):

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)) 

ここで重要なのは、その後正しく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)) 

別の方法としては、ModelAdminのサブクラス(またはミックスイン)にAJAXビューをembeddていますが、上記のルーティングdjango.contrib.adminの内部でおよそマックしたくない場合は、方法が容易であることができます。

関連する問題