2

我想在我的管理员中显示选定的画廊。我不是很有能力编写自定义字段,也找不到任何有据可查的指南。

至于我的问题,我编写了基本类,例如:

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 事物或以其他方式在我的管理员中显示所选画廊的任何知识,我将不胜感激?

4

3 回答 3

3

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

尽管如此,它还是一个关于如何在管理员中构建照片预览的教程。您可以使用它或通过 AJAX 调用来增强它。但恕我直言,再次没有必要......

PS最好从一开始就下载这个应用程序的完整源代码。

所以...文章:

Django 教程:照片管理器和共享应用程序第一部分。增强管理。

于 2011-07-30T06:29:49.540 回答
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”产品,其中您有带有图像的内联表单集)。

于 2011-08-02T22:58:41.597 回答
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))

这里的关键是将所需的数据交给小部件模板,然后它使用这些数据正确调用 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路由的内部结构,上述方法会更容易。

于 2011-08-05T06:58:05.440 回答