我想在我的管理员中显示所选的图库。我不太能够编写自定义字段,也找不到任何有关它的详细记录指南。
至于我的问题,我写了基本的课程,如:
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或者在我的管理员中显示选定图库的方式的知识吗?
答案 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
路由的内部进行混淆,则上述操作会更容易。