Передача идентификатора и контекста в Django Redirect

Я хочу передать модель на html-страницу в качестве контекста, когда я вхожу в учетную запись. url моей главной страницы содержит идентификатор пользователя в качестве параметра url. Но я не могу передать какой-либо контекст в редиректе

views.py

  from django.contrib.auth import authenticate,login,logout
from django.contrib import messages

from django.shortcuts import redirect, render
from django.http import HttpResponse
from .models import users
from home.models import Posts
 
def f1(request):
    Post = Posts.objects.all()
    context = {'Post':Post}
    if request.method == "POST":
        username = request.POST['username']
        password = request.POST['password']
        uz = authenticate(request,username=username, password=password)
        if uz is not None:
            login(request,uz)
            id = users.objects.filter(name=username).values('id')[0]['id']
            return redirect('home',id)  # This Works Fine
            return redirect('home',id,context) # This is not Working
        else:
            messages.error(request,"Wrong Credentials")
    return render(request,'login.html')

urls.py

 from django.contrib.auth import logout
from django.urls import path
from . import views

urlpatterns=[
    path('<str:users_id>/',views.func,name="home"),
]

Как я могу передать контекст? Если я не могу, подскажите альтернативный способ сделать это.

#Спасибо

Добавьте id в контекстный словарь и передайте его перенаправлению. Что-то вроде

context = {'Post':Post, 'Id':id}

return redirect('home', context)

Вы перенаправляете на другое представление, поэтому вы передаете данные через ваш url. Вы не можете поместить в него свой контекст, поэтому вы можете напрямую рендерить свой шаблон :

return render(request, "home.html", context)

Если вы действительно хотите перенаправить на другой url, поскольку ваш контекст содержит только все Post объекты, вы можете построить его в вашем home представлении. Тогда у вас будет :

f1 :

return redirect('home',id)

func :

context = {'Post': Posts.objects.all()}
return render(request, "home.html", context)

@Balizok прав: вы не можете передавать контекст через URL, без urlencoding, что было бы плохой идеей для больших объемов данных. Если вам нужно, чтобы главная страница показывала или не показывала сообщения в зависимости от того, вошел ли пользователь в систему, вы можете сделать это несколькими способами:


Показывать сообщения, только если пользователь вошел в систему:

def home(request, id):
    context = {}
    if request.user.is_authenticated:
        context["Post"] = Posts.objects.all()
    return render(request, "home.html", context)

Показывать сообщения, только если пользователь только что был перенаправлен со страницы входа в систему через параметр запроса:

from django.url import reverse

def f1(request):
    # ... log the user in etc.
    url = reverse("home", id) + "?show_posts=true"
    return redirect(url)
def func(request, id):
    context = {}
    if request.GET.get("show_posts") == "true":
        context["Post"] = Posts.objects.all()
    return render(request, "home.html", context)

Показывать сообщения, только если пользователь только что был перенаправлен со страницы входа через сессию:

from django.url import reverse

def f1(request):
    # ... log the user in etc.
    request.session["show_posts"] = True
    return redirect("home", id)
def func(request, id):
    context = {}
    if request.session.get("show_posts"):
        context["Post"] = Posts.objects.all()
    return render(request, "home.html", context)
Вернуться на верх