Django перенаправляет другое представление из другой формы приложения

contact/views.py

from django.core.mail import send_mail, BadHeaderError
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render, redirect
from .forms import ContactForm

def contactView(request):
    if request.method == 'GET':
        form = ContactForm()
    else:
        form = ContactForm(request.POST)
        if form.is_valid():
            subject = form.cleaned_data['subject']
            from_email = form.cleaned_data['from_email']
            message = form.cleaned_data['message']
            try:
                send_mail(subject, message, from_email, ['admin@example.com'])
            except BadHeaderError:
                return HttpResponse('Invalid header found.')
            # return redirect('success')
            return redirect('PostList') #another view from another app
    return render(request, "contact.html", {'form': form})

# def successView(request):
#     return HttpResponse('Success! Thank you for your message.')

contact/urls.py

from django.contrib import admin
from django.urls import path

from .views import contactView

urlpatterns = [
    path('contact/', contactView, name='contact'),
    # path('success/', successView, name='success'),
]

blog/views.py

from django.views import generic
from .models import Post, PostImage


# Create your views here.

class PostList(generic.ListView):
    queryset = Post.objects.filter(status=1).order_by('-created_on')
    template_name = 'index.html'

class PostDetail(generic.DetailView):
    model = Post
    template_name = 'post_detail.html'
    
    def get_context_data(self, **kwargs):
        # Call the base implementation first to get a context
        context = super().get_context_data(**kwargs)
        # Add in a QuerySet of all the books
        # context['image_list'] = PostImage.objects.all()
        # context['image_list'] = self.get_object().postimage_set.all()

        context['image_list'] = PostImage.objects.filter(post__slug=self.kwargs.get('slug'))
        return context

blog/urls.py

from . import views
from django.urls import path

urlpatterns = [
    path('', views.PostList.as_view(), name='home'),
    path('<slug:slug>/', views.PostDetail.as_view(), name='post_detail'),
]

Мне нужно следующее в самой простой DRY манере; как мне написать этот редирект внутри contact/views.py?

return redirect('PostList') #another view from another app

PostList - это представление на основе класса из другого приложения под названием blog. По сути, это домашняя страница.

для справки... https://ordinarycoders.com/blog/article/django-messages-framework

В папке вашего проекта (например, my_project/my_project) у вас должен быть urls.py с чем-то вроде этого

path("admin/", admin.site.urls),
path("", include("blog.urls")),
path("", include("contact.urls"))

Это позволяет django просматривать все файлы url в указанном порядке. Пока все ваши имена url и шаблоны уникальны, ваше представление должно быть способно просто делать

from django.shortcuts import redirect
from django.urls import reverse

return redirect(reverse('home'))

'home' - значение имени ListView.

(NB: если у вас есть различные файлы applevel urls.py с path(''... django возьмет первый попавшийся)

Вернуться на верх