在使用 Django 进行表单提交时,用户可以从一个页面输入信息并提交,然后被重定向到另一个页面继续输入信息。在第一个页面保存表单数据时,会生成一个主键用于标识该条数据。但是,在将用户重定向到第二个页面时,如何将这个主键传递过去以便在第二个页面中使用它呢?这正是本文要解决的问题。
2. 解决方案
解决这个问题的方法有很多种,其中一种最简单的方法是使用 Django 的 request.session
对象。request.session
对象是一个临时存储区,可以存储一些临时数据,这些数据会在用户会话期间一直存在。
具体步骤如下:
- 在第一个页面中,在保存表单数据之前,将主键存储在
request.session
对象中:
request.session['event_id'] = form.pk
- 在第二个页面中,通过
request.session
对象获取主键:
event_id = request.session.get('event_id')
- 然后,就可以将主键值用于第二个页面中的表单预填充或其他操作了。
值得注意的是,request.session
对象中的数据在用户会话结束时就会被清除,因此不适合存储敏感或重要的数据。
代码例子
以下是使用 request.session
对象传递主键的代码示例:
views.py
def add(request):
if request.method == 'POST':
form = AddEventForm(request.POST)
if form.is_valid():
form.save()
request.session['event_id'] = form.instance.pk
return HttpResponseRedirect(reverse('add_person'))
else:
form = AddEventForm()
return render(request, 'add_event.html', {'form': form})
def add_person(request):
event_id = request.session.get('event_id')
if request.method == 'POST':
form = AddPersonForm(request.POST)
if form.is_valid():
form.instance.event_id = event_id
form.save()
return HttpResponseRedirect(reverse('home'))
else:
form = AddPersonForm()
return render(request, 'add_person.html', {'form': form})
urls.py
from django.urls import path
urlpatterns = [
path('add_event/', views.add, name='add_event'),
path('add_person/', views.add_person, name='add_person'),
path('home/', views.home, name='home'),
]
models.py
class Event(models.Model):
name = models.CharField(max_length=255)
date = models.DateField()
def __str__(self):
return self.name
class Person(models.Model):
event = models.ForeignKey(Event, on_delete=models.CASCADE)
name = models.CharField(max_length=255)
def __str__(self):
return self.name
templates/add_event.html
{% extends 'base.html' %}
{% block content %}
<h1>Add Event</h1>
<form method="POST">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Save">
</form>
{% endblock %}
templates/add_person.html
{% extends 'base.html' %}
{% block content %}
<h1>Add Person</h1>
<form method="POST">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Save">
</form>
{% endblock %}
通过以上方法,我们就可以将主键从第一个页面传递到第二个页面,并用于预填充表单或其他操作。