当使用login_required重定向时,Django表单内容丢失。

问题描述 投票:0回答:1

我有类似的问题。Django表单数据在发布时需要登录时丢失了我想在用户登录时添加答案,否则将用户重定向到登录页面,让他登录后再添加答案。我的问题是,当重定向到登录页面时,我失去了表单的内容。

这些是我的观点。

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更多的东西。

django forms post get login-required
1个回答
0
投票

@login_required 装饰器自动添加一个 next GET参数到LOGIN_URL,这样用户就会被重定向到登录时触发的那个页面。现在,你是在从 answer 视图,所以用户会直接回到答题视图。只要发生重定向,POST数据就会丢失,所以除了暂时保存在Cookie中,或者登录后将用户重定向到问题页面外,你没有办法获得数据。

实现方式1

POST数据没有保存,但用户被重定向到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数据序列化成字符串。另外,需要 django.contrib.sessionsINSTALLED_APPSdjango.contrib.sessions.middleware.SessionMiddleware 在你 MIDDLEWARE. 结账 https:/data-flair.trainingblogsdjango-sessions。 如何设置、创建和删除会话变量。

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()
    ... 
    ...

希望对您有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.