Django содержимое формы потеряно при перенаправлении с использованием login_required - PullRequest
0 голосов
/ 27 мая 2020
• 1000 а затем добавьте свой ответ. Моя проблема в том, что я теряю содержимое формы при перенаправлении на страницу входа.

Это мои представления:

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>

Форма входа в систему template:

<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>

Я не знаю, можно ли передать что-то большее, чем url, с помощью next.

1 Ответ

0 голосов
/ 28 мая 2020
Декоратор

@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.sessions в INSTALLED_APPS и django.contrib.sessions.middleware.SessionMiddleware в вашем MIDDLEWARE. Оформить заказ https://data-flair.training/blogs/django-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()
    ... 
    ...

Надеюсь, это поможет.

...