在Django中将主键传递到下一页

0 投票
3 回答
1863 浏览
提问于 2025-04-20 18:33

我有以下几个文件:

Views.py:

def home(request):
    return render(request, 'home/index.html')

def add(request):
    if request.method == 'POST': # If the form has been submitted...
        # ContactForm was defined in the previous section
        form1 = AddEventForm(request.POST) # A form bound to the POST data
        #person = AddPersonForm(request.POST) # A form bound to the POST data
        if form1.is_valid(): # All validation rules pass
            form = form1.save()
            request.session['event_data'] = request.POST
            #request.session['event_data2'] = form
            return HttpResponseRedirect('/add_person/')
            #return HttpResponseRedirect(reverse('/add_person', kwargs={'PK':form.pk}))
    else:
        form1 = AddEventForm() # An unbound form
        person = AddPersonForm() # A form bound to the POST data

    return render(request, 'add/add.html', {
        'form1': form1, 'person': person,
    })


def add_person(request):

    event_data = request.session.get('event_data')
    if request.method == 'POST':
        person = AddPersonForm(request.POST)
    else:
        person = AddPersonForm()

    return render(request, 'add_person/add_person.html',{'event_data': event_data, 'person': person,})

models.py:

class event(models.Model):
    event_name = models.CharField(max_length=200)
    date = models.DateField('Date',default=date.today)
    event_id = models.AutoField(primary_key=True)
    admin_username = models.CharField(max_length=50)

    def __unicode__(self):
        return ('%s %s %d') % (self.date, self.event_name, self.event_id)

class Person(models.Model):
    eventID = models.ForeignKey(event)
    first_name = models.CharField(max_length=50)
    second_name = models.CharField(max_length=50)
    email = models.EmailField(max_length=50)
    phone = models.CharField(max_length=25)
    company = models.CharField(max_length=200)
    favourite = models.BooleanField(default=False)

    def __unicode__(self):
        return eventID

这个问题让我困扰了好几个小时。我有一个初始页面,用户在这里输入一些关于事件的信息。如果检查通过,表单就会保存,并生成一个主键。然后用户会被重定向到另一个页面,在那里填写他们在这个事件中遇到的人的信息。问题是我找不到把主键传递到第二个页面(add_people)的方法。我需要这个主键,因为它是我Person表中的外键,我需要用它来预填充add_people页面中的eventID

我最开始以为主键会在表单保存后出现在request.POST中,但实际上并没有。

3 个回答

0

如果你的表单通过了验证,那么你需要把 session 的值设置为 eventID,而不是 request.POST

if form1.is_valid(): # All validation rules pass
    form1.save(commit=False) 
    request.session['event_data'] = form1.cleaned_data['eventID']
    form1.save()
    return HttpResponseRedirect('/add_person/')
0

根据表单输入的信息去查询表格中的主键。一旦找到这个主键,就把它作为会话变量放在请求对象里。

0

这里有一个关于同样问题的回答,不过是用基于类的视图来解决,而不是基于函数的视图:如何在Django中使用通用类视图将父级ID作为外键传递给子对象的ModelForm?。在这个例子中,外键是通过URL中的参数从父页面传递到子页面的。子页面在表单的__init__函数中接收到这个参数,然后把它存储在一个隐藏字段中,以便显示(通过视图类的get_context_data和表单模板中的HTML代码),最后作为表单的一部分提交。

撰写回答