Django формирует INSERT, когда я хочу обновить - PullRequest
0 голосов
/ 04 марта 2010

Я новичок в Django, но у меня, похоже, почти идентичный код, работающий на другом сайте. Я могу обновить запись в оболочке Django, но в view.py тот же код настаивает на ВСТАВКЕ новой записи при запуске этой формы.

  • У меня есть объект "DisciplineEvent" в модели. Я позволил Django создать поле «id» для первичного ключа. Я вижу, что столбец "id" int был создан с auto_increment в MySQL
  • Форма DisciplineEventEntryForm создается из объекта модели "DisciplineEvent".
  • Для редактирования записи заполняется форма ввода, и pk помещается в скрытое поле с именем «id», которое представляется вместе с данными POST.

Итак, соответствующая часть view.py такова:

if request.method == 'POST':
    incidentId = request.POST['id']
    editedEvent = DisciplineEvent.objects.get(pk=int(incidentId))
    form = DisciplineEventEntryForm(request.POST, instance=editedEvent)
    form.save()
    variables = Context({
        'account': account,
        'date': request.POST['event_date'],
        'description': request.POST['incident_description'],
        'incident_id':incidentId,
         })
     template = get_template('disciplineform_confirm_entry.html')
     output = template.render(variables)
     response = HttpResponse(output)
     return response

Я думал, что это вызовет соответствующую запись, сохранит в ней новые данные формы и ОБНОВИТ запись. Вместо этого он создает новую запись со всеми данными и увеличенным первичным ключом.

1 Ответ

9 голосов
/ 04 марта 2010

То, что вы пытаетесь сделать, нетрадиционно и возможно дыра в безопасности .

Вы не должны получать экземпляр объекта из скрытого ключа id, который вы заполнили в форме. Пользователи могут легко изменить его и заставить ваш код перезаписать какой-либо другой экземпляр модели, на который у них может даже не быть разрешения.

Стандартный способ сделать это - получить объект на основе URL.

def view_function(request,id):
    object_to_edit = get_object_or_404(Model,id=id) #Or slug=slug
    form = ModelForm(data = request.POST or None, instance=object_to_edit)
    if form.is_valid():
        form.save()
        redirect()
    return render_to_response('template_name',{},RequestContext(request))

Надеюсь, это поможет!

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