Предварительный просмотр галереи в Django Admin - PullRequest
2 голосов
/ 30 июля 2011

Я хочу отобразить выбранную галерею в моем админе.Я не очень способен писать пользовательские поля и не могу найти никаких хорошо документированных рекомендаций по этому поводу.

Что касается моего вопроса, я написал базовые классы, такие как:

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 ]

3 голосов
/ 30 июля 2011

Здесь я увидел немного устаревший учебник об этом ... Это создает ваши собственные эскизы. Вам нужно использовать " sorl-thumbnail " в настоящее время для создания и хранения миниатюр. Это немного проще и более правильно ИМХО ...

Тем не менее, это учебник о том, как создать предварительный просмотр фотографий в админке. Вы можете использовать его или улучшить его с помощью вызовов AJAX. Но ИМХО опять не надо ...

P.S. Лучше скачать полные исходники этого приложения с самого начала.

так ... статья:

Учебное пособие по Django: Фотоорганизатор и приложение для обмена фотографиями, часть I. Совершенствование администратора.

1 голос
/ 05 августа 2011

Я отвечу на Где я могу разместить свои представления Admin / ModelForm Ajax? часть вашего вопроса, для части галереи, возможно, посмотрите на фотолог .

Что касается создания представлений, которые вызываются из форм администратора, я обнаружил, что создание простых пользовательских представлений является самым простым. В своем коде 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))

Ключевым моментом здесь является передача необходимых данных в шаблон виджета, который затем использует эти данные для правильного вызова обратного вызова 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, маршрутизация вышеописанного способа намного проще.

1 голос
/ 03 августа 2011

Ваш виджет (с дополнительной функцией обработки постфикса в имени файла) может выглядеть так:

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»)продукта, где у вас есть встроенная форма с изображениями).

...