无法在没有主键的情况下强制执行save()更新。恐怖!

时间:2011-05-11 01:02:38

标签: post django-models django-forms get django-views

我不知道该怎么做,我'空白'......

我有一个使用request.GET查询数据库并填写表单的函数,您可以更改内容并保存更新信息。问题是id没有传递给函数,Django选择INSERT而不是UPDATE,这里是代码:

看看这个烂摊子:

def meet_save(request):
  if request.method == 'POST':
    form = MeetingForm(request.POST)
      if form.is_valid():
        creator = get_object_or_404(Submitter, name=request.user)
        meeting = Meeting(creator=creator)
        meeting.ave = form.cleaned_data['ave']
        meeting.st = form.cleaned_data['st']
        meeting.date = form.cleaned_data['date']
        #it is supposed to work with save()
        #i tryed meeting.save(force_update=True)
        #and i figured out the id is missing
        meeting.save()
        for people in form.cleaned_data['people']:
            meeting.people.add(people)
        return HttpResponseRedirect('/meeting/register/')
  elif request.GET.has_key('meeting'):
    id = request.GET['meeting']        
    people = ''
    ave = ''
    st = ''
    date = ''
    try:
      meeting = meeting.objects.get(id=id)
      #id = unicode(request.GET['meeting'])
      #Have tryed different ways with no luck
      id = request.GET['meeting']
      ave = meeting.ave
      st = meeting.st
      date = meeting.date
      except:
        pass
      form = MeetingForm({
         'id':id, 'ave' : ave, 'st' : st,'date' : date
      })
  else:
    form = MeetingForm()
  variables = RequestContext(request, {
      'form': form,
  })
  return render_to_response('meeting/meeting_save.html', variables)

它接收在GET请求中传递的meeting = id(如/ meeting / register / meeting = 3)并且表单获取数据但是在保存时会创建一个新行而不是更新它,但它不会像wirk一样这在Django中,也许是PHP而不是Django !!!

这是Django的正确代码:

def meet_save(request):
  pk=request.GET['meeting'] #get the meeteng id from url
  form = MeetingForm(request.POST)
  if form.is_valid():
    meeting, created = Meeting.objects.get_or_create(id=pk)
    meeting.ave = form.cleaned_data['ave']
    meeting.st = form.cleaned_data['st']
    meeting.date = form.cleaned_data['date']
    meeting.people = form.claned_data['people']
    meeting.save()
    #for people in form.cleaned_data['people']:
      #meeting.people.add(people)
    return HttpResponseRedirect('/meeting/register/')
  else:
    meeting = get_object_or_404(Meeting, pk=request.GET['meeting'])# this is the id passed
    form = MeetingForm(instance=meeting)
  variables = RequestContext(request, {
        'form': form,
  })
  return render_to_response('meeting/meeting_save.html', variables)

我想mess可能会有效,但我修复了我的模板,因为 POST 是这样的: method = POST action =“。 “,当我到达页面时,我发现网址很好,但是当在帖子中发送数据时,它会清除 meeting = id ,我认为那是真正的恐怖!我将其更改为 action =“”我没有看到关于它的文档中的anithing,我已经读过它是相同的,请注意它不是。
Django摇滚!!!

1 个答案:

答案 0 :(得分:4)

您是否有理由不使用django内置机制用相关对象填充表单?例如:

meeting = Meeting.objects.get(pk=id)
form = MeetingForm(instance=meeting)

此外,您应该使用django快捷方式get_object_or_404,以便您可以避开不需要的行为。因此,它不会创建一个新对象,而只会发回404.没有造成任何伤害。