我在Django中有一个应用程序,它只有管理员才能使用。我想要做的是在管理应用程序的此应用程序部分添加一个按钮来执行例程。
我是否应该为它制作模板,如果是这种情况,如何在管理员中为应用添加html模板。或者可能只是添加按钮的命令?
答案 0 :(得分:13)
与管理表单混淆可能很复杂,但我经常发现添加链接,按钮或额外信息非常简单且有用。 (就像一个指向相关对象的链接列表,无需进行内联,尤其是查看比查看更多的内容)。
由于管理模板的模块化设计,通常是这样 既不必要也不可取 替换整个模板。它是 几乎总是更好地覆盖 您的模板部分 需要改变。
这将在表单顶部添加一个列表。
放在templates/admin/[your_app]/[template_to_override]
:
{% extends "admin/change_form.html" %}
{% block form_top %}
{% for item in original.items %}
{{ item }}
{% endfor %}
{% endblock %}
答案 1 :(得分:10)
Django1.10:
1)覆盖admin/submit_line.html
:
{% load i18n admin_urls %}
<div class="submit-row">
{% if extra_buttons %}
{% for button in extra_buttons %}
{{ button }}
{% endfor %}
{% endif %}
{% if show_save %}<input type="submit" value="{% trans 'Save' %}" class="default" name="_save" />{% endif %}
{% if show_delete_link %}
{% url opts|admin_urlname:'delete' original.pk|admin_urlquote as delete_url %}
<p class="deletelink-box"><a href="{% add_preserved_filters delete_url %}" class="deletelink">{% trans "Delete" %}</a></p>
{% endif %}
{% if show_save_as_new %}<input type="submit" value="{% trans 'Save as new' %}" name="_saveasnew" />{% endif %}
{% if show_save_and_add_another %}<input type="submit" value="{% trans 'Save and add another' %}" name="_addanother" />{% endif %}
{% if show_save_and_continue %}<input type="submit" value="{% trans 'Save and continue editing' %}" name="_continue" />{% endif %}
</div>
当然,这假设button
的字符串表示形式是适当的浏览器input
或button
元素,并使用django.utils.safestring.mark_safe
标记为安全。或者,您可以使用safe
模板过滤器或直接访问button
的属性来构建<input>
。在我看来,最好将这些东西隔离到python级别。
2)覆盖MyModelAdmin.change_view
:
def change_view(self, request, object_id, form_url='', extra_context=None):
extra_context = extra_context or self.extra_context()
return super(PollAdmin, self).change_view(
request, object_id, form_url, extra_context=extra_context,
)
此方法可让您轻松地向任何ModelAdmin
添加按钮。作为步骤(1)的替代,您可以扩展admin/change_form.html
并覆盖块submit_row
。由于模板中需要额外的标签,因此会稍微冗长一些。
如果您希望在所有模型(或特定子集)中提供额外操作,则将ModelAdmin
子类化为所需功能(例如,可以向模型添加归档。您甚至可以添加覆盖删除 - 以及其他默认按钮 - 以便模式存档而不是删除;这需要一些模板修改)
答案 2 :(得分:2)
您还可以使用django-admin-tools,这样您就可以像信息中心一样轻松自定义管理员首页。使用LinkList,您可以指向某个视图方法并检查用户是否已通过身份验证。它就像那个:
# dashboard.py (read more about how to create one on django-admin-tools docs)
class CustomIndexDashboard(Dashboard):
"""
Custom index dashboard for captr.
"""
def init_with_context(self, context):
self.children.append(modules.LinkList(
_('Tasks'),
children=[
['Your task name', '/task']
]
))
# urls.py (mapping uri to your view function)
urlpatterns += patterns('yourapp.views',
(r'^task$', 'task'),
)
# views.py
def task(request):
if request.user.is_authenticated():
update_definitions_task.delay() # do your thing here. in my case I'm using django-celery for messaging
return redirect('/admin')
答案 3 :(得分:0)
如果合适,您可以考虑为此类对象添加自定义管理操作(类似于内置&#39;删除&#39;)。一些好处包括:&#34;纯Django&#34;,不必弄乱模板,并且能够同时处理多个对象。
Django的管理员允许您编写和注册“操作” - 简单 使用在上面选择的对象列表调用的函数 更改列表页面。如果您查看管理员中的任何更改列表,您将会 看到这个功能在行动; Django附带“删除已选中 对象“可用于所有模型的动作。
https://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/
我从这篇文章中了解了如何添加自定义操作按钮,这是另一个答案。尽管如此,我还是可以通过更简单的内置操作来实现。
https://medium.com/@hakibenita/how-to-add-custom-action-buttons-to-django-admin-8d266f5b0d41
答案 4 :(得分:-28)
不要乱用管理页面。
为此创建“应用程序”。是的,你的功能只是一个“常规”。没关系。许多较小的应用程序是一件好事。
此应用程序在models.py
中没有任何新功能。没有新车型。零行代码。
此应用程序在urls.py
中有一个有用的网址。可用于显示此管理页面的内容。一个URL。代码行数不多(少于十几个。)
此应用程序在views.py
中有一个视图功能。在“GET”上,此视图功能呈现形式。在“POST”上,此视图功能执行“例程”。这是您的应用程序的“核心”。 GET - 当然 - 只是返回模板进行显示。 POST完成实际工作,并返回最终状态等。
此视图函数受装饰器保护,因此只有管理员才能执行它。
见http://docs.djangoproject.com/en/1.2/topics/auth/#django.contrib.auth.decorators.user_passes_test。你想写一个管理员的测试。可能是lambda u: u.is_staff
。
此应用程序有一个模板,由GET和POST提供。该模板包含您的按钮表单。您无法轻易添加到管理员的那个。
tests.py
是一个包含两个用户的测试用例,一个是管理员,另一个不是管理员。
没有搞乱内置管理页面。