在Django Admin中添加许多

时间:2015-03-17 02:08:46

标签: python django

在Django admin的模型列表视图中,有一个按钮可以添加一个模型。我想扩展一下,并能够一次添加多个项目。我的模型适用于图像,因此能够一次添加多个图像会很棒。

我已成功在单个模型视图中创建自定义字段,但不知道从列表视图开始的位置。有人至少可以指出我正确的方向吗?

编辑:

我想更改此视图,并在右上方添加一个按钮,以便"添加多个图像"

enter image description here

2 个答案:

答案 0 :(得分:0)

我想你想用tabularinline or stackedinline 假设您的模型具有一组图像和每个图像的模型 (例如。

class Portfolio(models.Model):
   name = models.CharField(max_length=100)

class Image(models.Model):
   port = models.ForeignKey(Portolio)
   name = models.CharField(max_length=100)
   img = models.ImageField() # or however you're storing the image, e.g. as a URL,

然后,您可以在admin.py中创建

class ImageInline(admin.TabularInline):
    model = Image

class PortfolioAdmin(admin.ModelAdmin):
    inlines = [
        ImageInline,
    ]

(你也可以指定附加内容,例如开始使用多少内联模型表单,但这应该让你开始,假设这是你的意思)

答案 1 :(得分:0)

好的,我明白了。它非常复杂,但并不坏:

第1步:改变ModelsAdmin定义中的change_list_template

class ImageAdmin(admin.ModelAdmin):
    ...
    change_list_template = 'admin/my_change_list.html'
    ...

第2步:复制并更改change_list.html

我在这里添加了新按钮

<li>
  {% url cl.opts|admin_urlname:'add' as add_url %}
  <a href="{% add_preserved_filters add_url is_popup to_field %}" class="addlink">
    {% blocktrans with cl.opts.verbose_name as name %}Add {{ name }}{% endblocktrans %}
  </a>
</li>

<li>
   {% url cl.opts|admin_urlname:'addmany' as add_url %}
   <a href="{% add_preserved_filters add_url is_popup to_field %}" class="addlink">
   {% blocktrans with cl.opts.verbose_name as name %}Add Many{{ name }}{% endblocktrans %}
   </a>
</li>

第3步:将新的Add Many网址添加到模型

def get_urls(self):
        from django.conf.urls import patterns, url

        def wrap(view):
            def wrapper(*args, **kwargs):
                return self.admin_site.admin_view(view)(*args, **kwargs)
            return update_wrapper(wrapper, view)

        info = self.model._meta.app_label, self.model._meta.model_name

        urlpatterns = patterns('',
                               # I added this!
            url(r'^addmany/$', wrap(self.add_multiple_view), name='%s_%s_addmany' % info),
            url(r'^$', wrap(self.changelist_view), name='%s_%s_changelist' % info),
            url(r'^add/$', wrap(self.add_view), name='%s_%s_add' % info),
            url(r'^(.+)/history/$', wrap(self.history_view), name='%s_%s_history' % info),
            url(r'^(.+)/delete/$', wrap(self.delete_view), name='%s_%s_delete' % info),
            url(r'^(.+)/$', wrap(self.change_view), name='%s_%s_change' % info),

        )
        return urlpatterns

第4步:创建视图def

def add_multiple_view(self, request):
        return TemplateResponse(request, 'admin/add_many.html', {}, current_app=self.admin_site.name)

第5步:创建add_many.html