【问题标题】:Passing A primary key to the next page in with Django使用 Django 将主键传递到下一页
【发布时间】:2014-09-09 23:16:18
【问题描述】:

所以我有以下文件:

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 中,但事实并非如此。

【问题讨论】:

    标签: python mysql django


    【解决方案1】:

    使用表单输入作为参数查询表的主键。获得密钥后,将其作为会话变量传递到请求对象中。

    【讨论】:

      【解决方案2】:

      以下是同一问题的答案,但使用基于类的视图而不是基于函数的视图:How do I pass a parent id as an fk to child object's ModelForm using generic class-based views in Django?。在该示例中,外键通过作为 URL 中的参数从父页面传递到子页面。子页面将其捕获为表单参数(在表单的__init__ 函数中),将其存储在隐藏字段中以供显示(通过View 类的get_context_data 和表单模板中的html 代码),然后将其作为一部分提交的形式。

      【讨论】:

        【解决方案3】:

        如果您的表单经过验证,那么您必须将 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/')
        

        【讨论】:

          猜你喜欢
          • 2012-05-16
          • 1970-01-01
          • 2014-09-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-10
          • 1970-01-01
          • 2013-09-14
          相关资源
          最近更新 更多