Невозможно принудительно выполнить обновление в save () без первичного ключа. Фильм ужасов ! - PullRequest
2 голосов
/ 11 мая 2011

я не знаю, что делать, я "пустой" ...

У меня есть функция, которая запрашивает базу данных, используя 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 / register / meeting = 3), и форма получает данные, но при сохранении создает новую строку вместо ее обновления, но она не работает как это в Django, может быть PHP, но не в 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 = "." и я понял, что URL-адрес в порядке, когда я попадаю на страницу, но при отправке данных в сообщении он очищает meeting = id , и я думаю, что это был настоящий Ужас !! я изменил его на action = "" Я не видел anithing в документации об этом, и я прочитал, что это то же самое, знайте, что это не так.
Джанго качается !!!

1 Ответ

4 голосов
/ 11 мая 2011

Есть ли причина, по которой вы не используете встроенный механизм django для заполнения формы связанным объектом? Например:

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

Кроме того, вы должны использовать ярлык django get_object_or_404, чтобы избежать нежелательного поведения. Таким образом, вместо создания нового объекта, он просто отправит обратно 404. Никакого вреда не сделано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...