我有下一个简单的模型:
class Reseller(models.Model):
type = models.CharField(
max_length=32,
choices=(
('active', 'active'),
('inactive', 'inactive')))
first_name = models.CharField(max_length=64, verbose_name='First Name')
last_name = models.CharField(max_length=64, verbose_name='Last Name')
email = models.CharField(max_length=64, verbose_name='E-mail')
password = models.CharField(max_length=64, blank=True, editable=False)
我为此模型自动为CRUD生成了管理部分。我想在更新页面添加“重新发送密码”按钮(它基本上会向经销商发送新凭据),但我不知道如何。我知道扩展功能,但我不知道如何正确应用它。单击此页面后,最好转到同一页面,但添加某种类型的“新密码已发送”。
此外,我不知道如何在Django管理员中处理这个新的按钮操作。任何代码片段都会很有用。感谢
更新
我创建了change_form.html
并扩展了原始模板
{% extends "admin/change_form.html" %}
{% load i18n %}
{% block object-tools %}
{% if change %}
<ul class="object-tools">
<li><a href="reset_password/">Reset Password</a></li>
</ul>
{% endif %}
{% endblock %}
但我不知道如何处理这个HTTP请求。另外我如何传递任何参数?我应该创建一个表单而不是按钮吗?
答案 0 :(得分:2)
您可能需要编写管理员操作,请查看django documentation以获取更多详细信息。
更新:您应该创建类似的内容,您将获得一个可以从代理商列表页面应用于一个或多个选定代理商的操作。你最终会得到这样的结论:
from django.contrib import admin
from myapp.models import Reseller
class ResellerAdmin(admin.ModelAdmin):
...
actions = ['reset_password']
def reset_password(self, request, queryset):
for obj in queryset:
obj.password = genereate_new_passwd()
sender.send(obj.email, obj.password)
obj.save()
self.message_user(request, "Passwords were resets for selected resellers successfully.")
reset_password.short_description = "Resend Passwords for selected resellers"
admin.site.register(Reseller, ResellerAdmin)
更新2: 要在模型更改页面中提供自定义操作,您需要自定义ResellerAdmin change_view()并提供 带有一些自定义操作的自定义模板。
from django.contrib import admin
from myapp.models import Reseller
change_form_template = 'admin/myapp/extras/reseller_change_form.html'
class ResellerAdmin(admin.ModelAdmin):
def change_view(self, request, object_id, form_url='', extra_context=None):
if(comming from new action)
# intercept the request post here, if it comes from your new button, do reset password
else:
return super(ResellerAdmin, self).change_view(request, object_id,
form_url, extra_context=extra_context)
另一种方法是通过添加布尔字段来自定义表单,并在save_model()上检查是否为True,然后重置密码并保存,否则只需保存对象。在这种情况下,您不必提供自定义模板。
class ResellerAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
if change and form.is_reset:
#do reset password and send
obj.save()
def get_form(self, request, obj=None, **kwargs):
form = super(ResellerAdmin, self).get_form(request, obj, **kwargs)
form.fields['is_reset'] = form.BooleanField()
return form
上面的代码并不完整,但为了显示这个想法,可以找到有关自定义ModelAdmin的更多详细信息here