Jan Zimmermann
Jan Zimmermann

Reputation: 19

Django class based view: passing additional information to the next view

I'm very new to Django and a bit overwhelmed by the documentation. I think my problem is pretty simple but everything i've found just confused me more.

I am building a little news app with a model NewsItem:

from django.db import models
from django.utils import timezone

# Create your models here.
class NewsItem(models.Model):
    title = models.CharField(max_length=50)
    newsText = models.TextField()
    dateEntered = models.DateTimeField('date entered')
    datePublished = models.DateTimeField('date published', blank=True, null=True)
    user = models.CharField(max_length=30) #temporary field. will be changed to user foreign key

    def __str__(self):
        return self.title
    def publish(self):
        if (self.datePublished == None):
            self.datePublished = timezone.now()
    def published(self):
        return self.datePublished != None

two views (technically 3) index and detail

from django.http import HttpResponseRedirect
from django.shortcuts import render, get_object_or_404
from django.urls import reverse
from django.views import generic

from .models import NewsItem

# Create your views here.
class IndexView(generic.ListView):
    template_name = 'news/index.html'
    context_object_name = 'latestNewsList'

    def get_queryset(self):
        return NewsItem.objects.order_by('-datePublished')[:5]
#todo
class DetailView(generic.DetailView):
    model = NewsItem
    template_name = 'news/detail.html'

def publish(request, itemId):
    newsItem = get_object_or_404(NewsItem, pk=itemId)
    newsItem.publish()
    newsItem.save()
    return HttpResponseRedirect(reverse('news:detail', args=(newsItem.id,)))

and an urlconf like this

from django.urls import path
from . import views

urlpatterns = [
    path('', views.IndexView.as_view(), name='index'),
    path('<int:pk>/', views.DetailView.as_view(), name='detail'),
    path('<int:itemId>/publish', views.publish, name='publish'),
]

In the detail view i have a link Publish which just triggers the function views.publish. This view is supposed to redirect back to the detail view. What i'm trying to do now is to display a little message (like article successfully published) in detail view when it was redirected by the publish view. But i have no idea what would be a good aproach

I could just render the details template in the publish view, but then it would still say news/publish in the URL instead of news/detail

Thanks in advance for your help

Upvotes: 1

Views: 58

Answers (1)

Alasdair
Alasdair

Reputation: 308849

Have a look at the messages framework. You could add a success message before redirecting, which will be displayed on the next page.

from django.shortcuts import redirect
from django.contrib import messages


def publish(request, itemId):
    newsItem = get_object_or_404(NewsItem, pk=itemId)
    newsItem.publish()
    newsItem.save()
    messages.success(request, "The post has been published")
    return redirect('news:detail', newsItem.id)

Note that I've simplified the return statement to use redirect(...) instead of HttpResponseRedirect(reverse(...)).

Upvotes: 2

Related Questions