Django Admin中的画廊预览

时间:2011-07-29 20:46:43

标签: ajax django gallery admin django-widget

我想在我的管理员中显示所选的图库。我不太能够编写自定义字段,也找不到任何有关它的详细记录指南。

至于我的问题,我写了基本的课程,如:

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 个答案:

答案 0 :(得分:3)

在这里,我看到了一些关于它的过时教程...... 它会创建您自己的缩略图。您现在需要使用“sorl-thumbnail”来生成缩略图并将其存储起来更简单,更正确的方式恕我直言......

然而,这是如何在管理员中构建照片预览的教程。您可以使用它或使用AJAX调用来增强它。但恕我直言,这不是必要的......

P.S。最好从一开始就下载这个应用程序的完整资源。

所以...文章:

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

答案 1 :(得分:1)

您的小部件(具有在文件名中处理postfix的额外功能)可能如下所示:

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

希望它有所帮助。如果它不符合您的需求,请写下更多细节,我会尝试找出一些东西(我想知道您想要在哪里展示画廊的预览 - 是“更改列表”还是“更改_view”产品,你有图像的内联formset。)

答案 2 :(得分:1)

我会回答我在哪里提交我的Admin / ModelForm Ajax视图?部分问题,因为图库部分可能会看一下photologue

至于创建从管理表单调用的视图,我发现创建简单的自定义视图最简单。在您的Javascript代码中,您只需使用特定于您应用的数据来调用{% url my_ajax_view %}

例如(ajaxy foreignkey search的修改版本):

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路由的内部进行混淆,则上述操作会更容易。