0

我有下一个简单的模型:

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 请求。另外我怎样才能传递任何参数?我应该创建一个表单而不是按钮吗?

4

1 回答 1

2

您可能需要编写管理操作,查看django 文档了解更多详细信息。

更新:您应该创建类似这样的内容,您将获得一个可以从经销商列表页面应用于一个或多个选定经销商的操作。你最终会得到这样的东西:

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 的细节可以在这里找到

于 2013-02-17T11:14:41.217 回答