python - Using Django Admin Actions to send bulk emails -
i'm looking way send bulk emails users django admin action. have far:
class myuseradmin(useradmin): list_display = ['username', 'email', 'first_name', 'last_name', 'is_active', staff] list_filter = ['groups', 'is_staff', 'is_superuser', 'is_active'] actions = ['send_email'] def send_email(self, request, queryset): django.core.mail import send_mail in queryset: if i.email: send_mail('subject here', 'here message.', 'from@example.com',[i.email], fail_silently=false) else: self.message_user(request, "mail sent ") send_email.short_description = "send email selected users" this fine but! have hardcode actual message every single time. if make dynamic? instead of changing message admin.py every single time need send bulk email, why not create intermediate django admin action page has empty text input field can write new message send every single time?
how can done? i'm looking detailed answer not open ended , generic.
you on right track. here implementation of django admin action allows write message selected users. (i know super late might else).
send_email function:
def send_email(self, request, queryset): form = sendemailform(initial={'users': queryset}) return render(request, 'users/send_email.html', {'form': form}) send_email.html template (i borrowed markup django confirm delete view may want different here):
{% extends "admin/base_site.html" %} {% load i18n admin_urls static %} {% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} delete-confirmation{% endblock %} {% block breadcrumbs %} <div class="breadcrumbs"> <a href="{% url 'admin:index' %}">{% trans 'home' %}</a> › <a href="{% url 'admin:app_list' app_label='users' %}">{% trans "users" %}</a> › <a href="{% url 'admin:users_user_changelist' %}">{% trans "users" %}</a> › <span>send email</span> </div> {% endblock %} {% block content %} <p>{% blocktrans %}write message here{% endblocktrans %}</p> <form method="post" action="{% url 'users:email' %}">{% csrf_token %} <div> <div> <p>{{ form.users.errors }}</p> <p>{{ form.users.label_tag }}</p> <p> {% user in form.users.initial %} {{ user.email }}{% if not forloop.last %}, {% endif %} {% endfor %} </p> <select name="users" multiple style="display: none"> {% user in form.users.initial %} <option value="{{ user.id }}" selected>{{ user }}</option> {% endfor %} </select> </div> <div> <p>{{ form.subject.errors }}</p> <p>{{ form.subject.label_tag }}</p> <p>{{ form.subject }}</p> </div> <div> <p>{{ form.message.errors }}</p> <p>{{ form.message.label_tag }}</p> <p>{{ form.message }}</p> </div> <input type="submit" value="{% trans 'send message' %}" /> <a href="{% url 'admin:users_user_changelist' %}" class="button cancel-link">{% trans "no, take me back" %}</a> </div> </form> {% endblock %} send email form class:
class sendemailform(forms.form): subject = forms.charfield( widget=forms.textinput(attrs={'placeholder': _('subject')})) message = forms.charfield(widget=forms.textarea) users = forms.modelmultiplechoicefield(label="to", queryset=user.objects.all(), widget=forms.selectmultiple()) and send email view + url conf:
# url pattern url( regex=r'^email-users/$', view=views.senduseremails.as_view(), name='email' ), # senduseremails view class class senduseremails(isstaff, formview): template_name = 'users/send_email.html' form_class = sendemailform success_url = reverse_lazy('admin:users_user_changelist') def form_valid(self, form): users = form.cleaned_data['users'] subject = form.cleaned_data['subject'] message = form.cleaned_data['message'] email_users.delay(users, subject, message) user_message = '{0} users emailed successfully!'.format(form.cleaned_data['users'].count()) messages.success(self.request, user_message) return super(senduseremails, self).form_valid(form) this implementation worked fine me. here intermediate view looks like:
you might have change couple of things in template build out breadcrumbs or reverse url view in case don't have app called users or model called user.

Comments
Post a Comment