Django Admin对单个对象的操作

gue*_*tli 9 django django-admin

管理员操作似乎适用于在django管理界面的列表视图中选择的几个项目:

在我的情况下,我想在更改(一个项目)视图上有一个简单的操作按钮.

有没有办法让django管理员行动在那里?

我知道我可以通过转到列表视图来解决这个问题,并在那里选择一个项目.但直接提供它会更好.

D.N*_*bon 15

在您的应用中为您的模型创建模板.

templates/admin/<yourapp>/<yourmodel>/change_form.html
Run Code Online (Sandbox Code Playgroud)

使用此示例内容在更改现有对象时添加按钮.

{% extends "admin/change_form.html" %}
{% block submit_buttons_bottom %}
    {{ block.super }}
    {% if original %} {# Only show if changing #}
        <div class="submit-row">
            <a href="{% url 'custom-model-action' original.pk %}">
                 Another action
            </a>
        </div>
    {% endif %}
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

将该操作链接到任何URL并重定向回模型更改对象视图.有关扩展管理模板的更多信息.

更新:添加了对现有对象的自定义操作的完整常见用例

urls.py

urlpatterns = [
    url(r'^custom_model_action/(?P<object_pk>\d+)/$',
        core_views.custom_model_action, name='custom-model-action')
]
Run Code Online (Sandbox Code Playgroud)

views.py

from django.contrib import messages
from django.http import HttpResponse, HttpResponseRedirect

def custom_model_action(request, object_pk):
    messages.info(request, 'Performed custom action!')
    return HttpResponseRedirect(
       reverse('admin:<yourapp>_<yourmodel>_change', args=[object_pk])
    )
Run Code Online (Sandbox Code Playgroud)


bin*_*npy 5

如果您确实需要单个对象,我建议您使用此解决方案,例如:

class Gallery(TimeStampedModel):
    title = models.CharField(max_length=200)
    attachment = models.FileField(upload_to='gallery/attachment/%Y/%m/%d')

    def __str__(self):
        return self.title

    def process_button(self):
        return ('<button id="%(id)s class="btn btn-default process_btn" '
                'data-value="%(value)s>Process</button>' % {'id': self.pk, 'value': self.attachment.url})
    process_button.short_description = 'Action'
    process_button.allow_tags = True
Run Code Online (Sandbox Code Playgroud)

在您的 中admin.pyprocess_button插入 list_display;

class GalleryAdmin(admin.ModelAdmin):
    list_display = ['title', 'process_button', 'created']
    search_fields = ['title', 'pk']
    ....

    class Media:
        js = ('path/to/yourfile.js', )
Run Code Online (Sandbox Code Playgroud)

然后,在里面yourfile.js,你还可以处理它。

$('.process_btn').click(function(){
    var id = $(this).attr('id');       // single object id
    var value = $(this).data('value'); // single object value
    ...
});
Run Code Online (Sandbox Code Playgroud)

希望有帮助..