【问题标题】:Django 1.6: Save form data temporarily between pagesDjango 1.6:在页面之间临时保存表单数据
【发布时间】:2016-03-25 00:45:53
【问题描述】:

我正在创建一个用户评论表单,患者可以在其中对他们的医生进行评论。我只希望登录的用户写评论,每个医生每个用户只有 1 条评论。无论用户是否登录,都会显示一个评论表单。如果未登录,单击提交按钮后,页面将重定向到登录表单,并在成功验证后重定向回医生资料。但是当用户被重定向时,表单数据会丢失。

如何临时保存表单数据,以便在用户成功验证后返回并提交表单时保留在那里?我已经在您可以使用会话的地方阅读它,但一切都如此压倒性和令人困惑,我无法理解。

docprofile.html

{% if reviewed == False %}
<form action="" method="post" id="user_uploader" > {% csrf_token %}
<div class="revbox">
<textarea type="text" class="form-control" id="comment" placeholder="How was your experience?" name="comment" rows="6"></textarea>

<div class="subbox">
<div class="like-dis-check">
<p id="wouldrec"> Would you recommmend this doctor to someone else?</p>
<input type="radio" id="radio1" name="Like" value="Like">
<label id="r1" for="radio1">Yes</label>
<input type="radio" id="radio2" name="Like" value="Dislike">
<label id="r2" for="radio2">No</label>
</div>

<div class="drop1">
<input type="hidden" name="user" value="{{ user.id }}" />
<input type="hidden" name="doctor" value="{{ doctor.id }}" />
</div>

{% if not user.is_authenticated %}

<div class="subbutton">
<a class="btn btn-primary" href="{% url 'login' %}?next={{ request.path }}" type="" name="submit" id="ss-submit">Submit</a>
</div>

{% else %}

<div class="subbutton">
<button class="btn btn-primary" type="submit" name="submit"id="ss-submit">Submit</button>
</div>

{% endif %} 


<div class="errorbox">
{% for field in form.visible_fields %}
{{ field.errors }}
{% endfor %}
</div>
</div>
</div>
</form>
{% elif user.is_authenticated and reviewed == True  %}
<h4><a class="writebtn">Already Reviewed!</a></h4>
{% else %}
<a class="btn btn-primary writebtn" onclick = " ga('send','event', 'button' , 'Write a Review', 'Dr. {{doctor.name}}', 7);" href="{% url 'login' %}?next={{ request.path }}">Write a Review</a>  
{% endif %}

view.py

def showDocProfile(request, slug):

    doctor = get_object_or_404(Doctor, slug=slug)

    d = getVariables(request,dictionary={'page_name': "Dr. " + doctor.name +"  "+ doctor.specialization.name +"})

    if request.user.is_authenticated():
        user = request.user

    if request.method == "POST":
        form = UserContentForm(request.POST)

        if form.is_valid():
            comment = form.cleaned_data['comment']


            if request.POST.get('Like') == 'Like':
                con = UserContent(comment = comment, liked = True, disliked = False, doctor_id = doctor.id, user_id = request.user.id)
                doctor.likes += 1
                doctor.netlikes = doctor.likes - doctor.dislikes
                doctor.save()
                con.save()

            elif request.POST.get('Like') == 'Dislike':
                con = UserContent(comment = comment, liked = False, disliked = True,  doctor_id = doctor.id, user_id = request.user.id)
                doctor.dislikes +=1
                doctor.netlikes = doctor.likes - doctor.dislikes
                doctor.save()
                con.save()

            url = '/docprofile/%s' % str(doctor.id)
            return HttpResponseRedirect(url)
    else:
        form = UserContentForm()

    UGC = UserContent.objects.filter(doctor_id=doctor.id).order_by('-submitted_on') # Reviews on Meddy


    d.update({'doctor': doctor, 'UGC': UGC,'form': form,  'doctors': Doctor.objects.all().order_by('-rating')})
    return render(request, 'm1/docprofile.html', d)

【问题讨论】:

  • 会话确实是你会做的。但是如果用户未登录,我在该代码中看不到任何重定向的内容;这是在哪里发生的?
  • 在文档资料中。 {% 如果不是 user.is_authenticated %}。当用户单击提交按钮时,它会被重定向到登录页面。

标签: python django forms


【解决方案1】:

在模板中进行重定向是错误的地方。如果您这样做,则没有机会将其保存在会话中。相反,您应该始终提交到您的 showDocProfile 视图,并在必要时在那里进行重定向:

if request.user.is_authenticated():
    user = request.user
else:
    request.session['doctor_data'] = request.POST
    return redirect("{}?{}".format(reverse('login'), request.path))
if request.method == "POST":
...
else:
    data = request.session.pop('doctor_data', None)
    form = UserContentForm(data)
...

【讨论】:

  • 但是这样用户在没有登录的情况下甚至看不到医生资料,更不用说尝试写评论了。我想在提交表单时提示登录。
  • 好的,所以把这个逻辑移到request.method==POST检查中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-21
  • 2015-03-11
  • 2015-06-29
  • 2015-05-20
  • 2012-02-28
  • 2012-05-26
  • 1970-01-01
相关资源
最近更新 更多