rrb_bbr
rrb_bbr

Reputation: 3056

Best way to implemente confirmantion and alert messages

I was wondering if you guys could share with me your strategies to display alert and confirmation messages in Django. I'm really not sure what would be the best way to achieve this. Do you keep a separate .py file with the messages and a wrapping function, or you just hard code everything along the code? And you think that should be prioritarily in the view or in the template?

Anyway, thanks.

Upvotes: 1

Views: 2938

Answers (2)

Muhammed K K
Muhammed K K

Reputation: 1172

I use a re usable view for displaying confirmation

Re usable view

def bootstrap_confirm(
        request,
        heading,
        message,
        yes_color='success',
        yes_text='Yes',
        cancel_color='danger',
        cancel_text='No',
        cancel_url='',
        box_color='info',
        base_name='base.html'):
    if request.method == 'POST':
        confirm = request.session['confirm_value']
        assert request.POST.get('confirm') == confirm, "Error"
        return request.POST.get('submit_button') == yes_text
    else:
        confirm = get_random_string(16)
        request.session['confirm_value'] = confirm
        return render_to_response('django-helpers/twitter-bootstrap/confirm.html', request, {
            'confirm_value': confirm,

            'confirm_heading': heading,
            'message': message,
            'base_name': base_name,
            'box_color': box_color,

            'yes_color': yes_color,
            'yes_text': yes_text,

            'cancel_color': cancel_color,
            'cancel_text': cancel_text,
            'cancel_url': cancel_url,
        })

Re usable Template

{% extends base_name %}

{% block main-contents %}
    <h2>{{ confirm_heading }}</h2>
    <form action="" method="post">
        {% csrf_token %}
        <input type="hidden" name="confirm" value="{{ confirm_value }}">

        <div class="alert alert-{{ box_color|default:"info" }}">
            <div>{{ message }}</div>
        <br>
            <div>
                <input type="submit" class="btn btn-{{ yes_color|default:"success" }}" name="submit_button" type="submit" value="{{ yes_text|default:"Yes" }}">
                {% if cancel_url %}
                    <a href="{{ cancel_url }}" class="btn btn-{{ cancel_color|default:"danger" }}">{{ cancel_text|default:"No" }}</a>
                {% endif %}
            </div>
        </div>
    </form>
{% endblock %}

View

def confirm(request):
    msg = '...'
    heading = '...'
    op = bootstrap_confirm(request, heading, msg)
    if isinstance(op, HttpResponse):
        return op

    if op == True:
        # Implement custom logic
    elif op == False:
        # Implement custom logic

You can use a similar re usable view to display messages also. This code is from my library django-helpers. I am also interested in knowing more strategies. Correct me if I am wrong ?

Upvotes: 0

Burhan Khalid
Burhan Khalid

Reputation: 174624

Django comes with a messages application that helps with this.

In your view, you would add the messages that you need displayed:

from django.contrib import messages
from django.shortcuts import render

def someview(request):
    # your normal code
    messages.add_message(request, messages.INFO, 'Yeehaw!')
    return render(request, 'sometemplate.html')

Notice I didn't return the message in my view, this is because the messages middleware takes care of this for me. All I have to do is return a RequestContext, which the render shortcut does.

In the template:

{% if messages %}
  {% for message in messages %}
    <div{% if message.tags %} class="alert alert-{{ message.tags }}"{% endif %}>
      <a class="close" data-dismiss="alert" href="#">&times;</a>
      {{ message }}
    </div>
  {% endfor %}
{% endif %}

Usually you would put the above code in one of your base templates that every template inherits from; and that's it.

Upvotes: 2

Related Questions