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 admin 内でこの新しいボタン アクションを処理する方法がわかりません。どんなコード スニペットも役に立ちます。ありがとう

更新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 のドキュメントを確認してください。

更新: このようなものを作成する必要があります。リセラー リスト ページから選択した 1 つ以上のリセラーに適用できるアクションを取得します。次のような結果になります。

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)

もう 1 つの方法は、ブール フィールドを追加してフォームをカスタマイズし、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 に答える