使用 login_required 重定向时 Django 表单内容丢失 [英] Django form content lost when redirecting using login_required

查看:143
本文介绍了使用 login_required 重定向时 Django 表单内容丢失的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有类似的问题:Django在帖子中要求登录时表单数据丢失如果用户登录,我希望添加答案,否则将用户重定向到登录页面,让他登录然后添加他的答案.我的问题是我在重定向到登录页面时丢失了表单的内容.

I have problem similar to this one: Django form data lost on making login required on post I want answer to be added if user is logged in otherwise redirect user to login page, let him login and then add his answer. My problem is that I lose content of the form when redirecting to login page.

以下是我的观点:

def question(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    form = AnswerForm()

    return render(request, 'questions/question.html', {'question': question, 'form' : form},)

@login_required
def answer(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    form = AnswerForm(request.POST) if request.method == 'POST' else AnswerForm()
    if form.is_valid():
        answer = form.save(commit=False)
        answer.author = request.user
        answer.question = question
        answer.save()
    return HttpResponseRedirect(reverse('question', args=(question.id,)))

表格:

<form method="POST" action="{% url 'answer' question.id %}">
    {% csrf_token %}
    {{form.as_p}}
    <input type="submit" value="Odpowiedz">
</form>

登录模板中的表单:

<form method="post" action="{% url 'login' %}">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="hidden" name="next" value="{{request.GET.next}}" />
    <input type="submit" value="login" />
</form>

我不知道是否可以通过使用 next 来传递 url 以外的内容.

I don't know if something more than url can be passed by using next.

推荐答案

@login_required 装饰器自动添加一个 next GET 参数到 LOGIN_URL,以便用户被重定向回来到触发登录的同一页面.现在,您从 answer 视图触发它,因此用户将直接返回到 answer 视图.POST 发生重定向时数据丢失,因此您无法获取数据,只能将其临时保存在 cookie 中或在用户登录后将用户重定向到问题页面.

@login_required decorator automatically adds a next GET parameter to the LOGIN_URL, so that user is redirected back to the same page the login was triggered from. Right now, you're triggering it from the answer view, so user will come back directly to answer view. POST Data is lost whenever a redirect occurs, so there's no way you can get the data except for temporarily saving it in cookies or redirecting the user to question page after login.

POST 数据未保存但用户被重定向到 QuestionView

POST Data is not saved but the user gets redirected to QuestionView

from django.shortcuts import redirect, reverse
...
...

def answer(request, question_id):

    if not request.user.is_authenticated:
        return redirect("%s?next=%s" % (settings.LOGIN_URL, reverse('question-view-name'))
    ... 
    ...

实施 2

POST 数据保存到会话中,然后在登录后检索.我还没有尝试过,它要求您将 POST 数据序列化为字符串.此外,在 INSTALLED_APPSdjango.contrib.sessions.middleware.SessionMiddleware 中需要 django.contrib.sessions 在你的 MIDDLEWARE>.结帐 https://data-flair.training/blogs/django-sessions/了解如何设置、创建和删除会话变量.

Implementation 2

POST Data is saved to the session and then retrieved after login. I haven't tried it and it required you to serialize POST data to string. Also, requires django.contrib.sessions in INSTALLED_APPS and django.contrib.sessions.middleware.SessionMiddleware in your MIDDLEWARE. Checkout https://data-flair.training/blogs/django-sessions/ for how to set, create and delete session variables.

from django.shortcuts import redirect, reverse
...
...

def answer(request, question_id):

    if not request.user.is_authenticated:
        request.session['form_data'] = YourSerializerFunctionToSerializeFormData(request.POST) 
        # must retuern a string, use json.dumps() to convert a dictionary to string

        return redirect("%s?next=%s" % (settings.LOGIN_URL, reverse('answer-view-name', args=[question_id]))

    data = None
    if request.method == 'GET':
        if 'form_data' in request.session:
            data = request.session['form_data']
            del request.session['form_data'] # Delete the key once done
    else:
        data = request.POST

    ...
    form = AnswerForm(data) if data else AnswerForm()
    ... 
    ...

希望有帮助.

这篇关于使用 login_required 重定向时 Django 表单内容丢失的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆