我有类似的问题。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更多的东西。
@login_required
装饰器自动添加一个 next
GET参数到LOGIN_URL,这样用户就会被重定向到登录时触发的那个页面。现在,你是在从 answer
视图,所以用户会直接回到答题视图。只要发生重定向,POST数据就会丢失,所以除了暂时保存在Cookie中,或者登录后将用户重定向到问题页面外,你没有办法获得数据。
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'))
...
...
POST数据保存到会话中,登录后再检索。我没试过,需要你把POST数据序列化成字符串。另外,需要 django.contrib.sessions
在 INSTALLED_APPS
和 django.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()
...
...
希望对您有所帮助。