繁体   English   中英

在 Django 重定向中传递 ID 和上下文

[英]Passing Id and Context in Django Redirect

我想在登录帐户时将模型作为上下文传递给 html 页面。 我的主页 url 带有用户 ID 作为 url 参数。 但我不能在重定向中传递任何上下文

视图.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')

网址.py

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

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

我怎样才能传递上下文? 如果我不能告诉我另一种方法来做到这一点。

您正在重定向到另一个视图,因此您正在通过您的 url 传递数据。 你不能把你的上下文放在里面,所以你可以直接渲染你的模板:

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

如果你真的想重定向到另一个 url,因为你的上下文只包含所有Post对象,你可以在你的home视图中构建它。 然后你有:

f1:

return redirect('home',id)

功能:

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

将 id 添加到您的上下文字典并传递给重定向。 就像是

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

return redirect('home', 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM