alex
alex

Reputation: 2541

Django add form on every page

In my application i need to add a form in base.html, which I've done. For this i used context_processors, now my problem is everytime i'm trying to post, i'm getting a blank page and this error: Method Not Allowed (POST)

In this form i want just to add a button where it will mark all current users notifications as read.

I know that you can use context_processors like this:

def my_context(request):
    data = dict()
    if request.user.is_authenticated:
        data['notifications'] = Notification.objects.filter(user=request.user, read=False)
        data['form'] = NotificationForm()
        return data

But instead of adding the form i need these lines:

def my_context(request):
    data = dict()
    if request.user.is_authenticated:
        data['notifications'] = Notification.objects.filter(user=request.user, read=False)
    if request.method == 'POST':
        if 'read-notifications' in request.POST:
            for notification in data['notifications']:
                notification.read = True
                notification.save()
        next = request.POST.get('next', '/')
        return redirect(next)
    return data

The form in base.html:

<form action="" method="POST">{% csrf_token %}
    <input type="hidden" name="next" value="{{ request.path }}">
    <button type="submit" class="btn m-btn--square  btn-primary" name="read-notifications">Mark as read</button>
</form>

urls.py

url(r'^orders/create/$', views.admin_order_document, name='create_order'),
url(r'^orders/waiting/$', views.OrdersWaitingListView.as_view(), name='order_waiting_list'),
url(r'^orders/unallocated/$', views.OrdersUnallocatedListView.as_view(), name='order_unallocated_list'),
url(r'^orders/working/$', views.OrdersWorkingListView.as_view(), name='order_working_list'),

How can i show this form on every page without getting the above error?

Upvotes: 1

Views: 772

Answers (1)

alex
alex

Reputation: 2541

So, I chose a different approach and i ended up with this solution:

base.html

<form action="{% url 'mark_read' %}" method="POST">{% csrf_token %}
    <input type="hidden" name="next" value="{{ request.path }}">
    <button type="submit" class="btn m-btn--square  btn-primary" name="action" value="mark_read">Marchează ca citite</button>
</form>

views.py

@login_required()
def read_notifications(request):
    if request.method == 'POST':
        if 'action' in request.POST:
            notifications = Notification.objects.filter(user=request.user, read=False)
            for notification in notifications:
                notification.read = True
                notification.save()
        next = request.POST.get('next', '/')
        return redirect(next)

urls.py

url(r'^mark-read/$', views.read_notifications, name='mark_read'),

Basically, the form action will redirect me to the view function, it will do what it has to do and it will redirect me back on the same page.

Upvotes: 2

Related Questions