Reputation: 5025
I have the next simple model:
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)
I have automatically generated admin section for CRUD for this model. I want to add "Resend password" button (which will basically send new credentials to reseller) at the Update page but I don't know how. I know about extends functionality but I don't know how to apply it correctly. After clicking this page would be good to go to the same page but adding some kind of nitification 'New password has been sent'.
Also I don't know how to handle this new button action within Django admin. Any code snippets would be useful. Thanks
UPDATE
I created change_form.html
and extends the original template
{% 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 %}
But I don't know how to treat this HTTP request. Also how can I pass any parameters? Should I create a form instead of button?
Upvotes: 0
Views: 575
Reputation: 4785
You might need to write Admin action, check django documentation for more details.
Update: you should create something like this, you will get an action which can be applied to one or more selected resellers from resellers list page. You will end up with something like this:
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)
UPDATE 2: To provide a custom action in model change page, you need to customize the ResellerAdmin change_view() and provide a custom template with some custom action.
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)
Another approach is to customize the form by adding a Boolean field, and on save_model() check if that is True, then reset password and save, otherwise just save the object. In this case you dont have to provide custom template.
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
The code above is not complete but to show the idea, more details on customizing ModelAdmin can be found here
Upvotes: 2