Подтвердить что ты не робот

Как обновить объект из формы редактирования в Django?

Возможно, вопрос новичков, поэтому, пожалуйста, несите меня.

У меня есть форма Django, которая редактирует определенный экземпляр Модели. Чтобы узнать, какой объект редактируется, у меня есть скрытое поле, содержащее идентификатор объекта, а также URL-адрес, содержащий идентификатор.

Первый вопрос: Имеет ли идентификатор объекта в скрытом поле правильный способ его выполнения?

Моя (возможно, необоснованная) озабоченность тем, что она только в качестве части URL-адреса заключается в том, что кто-то может открыть страницу одного идентификатора объекта, передать форму другому, и этот объект будет перезаписан. Вот почему я пытаюсь использовать скрытое поле.

Проблема с сохранением id в скрытом поле заключается в том, что при проверке формы Django жалуется, что объект не имеет уникального id (очевидно).

Второй вопрос. Если уникальное поле является частью формы, как сообщить Django игнорировать тот факт, что этот ключ уже существует, чтобы обновить объект?

4b9b3361

Ответ 1

Почему бы вам просто не использовать ModelForm?

# forms.py
# ...
class MyForm(forms.ModelForm):
    class Meta:
        model = MyModel

# views.py
# ...    
def my_view(request, id): 
    instance = get_object_or_404(MyModel, id=id)
    form = MyForm(request.POST or None, instance=instance)
    if form.is_valid():
        form.save()
        return redirect('next_view')
    return direct_to_template(request, 'my_template.html', {'form': form}     

Ответ 2

Обновление для Django 1.6 и дальнейшая версия

# forms.py
# ...
class MyForm(forms.ModelForm):

     class Meta:
     model = MyModel

# views.py  

def my_view(request, id): 
    instance = MyModel.objects.get(id=id)
    form = MyForm(request.POST or None, instance=instance)
    if form.is_valid():
          form.save()
          return redirect('next_view')
return direct_to_template(request, 'my_template.html', {'form': form})