Передача идентификатора и контекста в 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)