Где первичный ключ объекта, который я хочу обновить в django, используя modelform? - PullRequest
3 голосов
/ 14 июля 2010

Я использую модель формы в django для вставки и обновления объектов в моей базе данных, но при попытке обновления я не вижу первичного ключа / идентификатора обновляемого объекта:

Моя модель:

class Category(models.Model):
    name = models.CharField(max_length=20, db_index = True)

и моя форма:

class CategoryForm(ModelForm):
    class Meta:
        model = Category
        fields = ['name']

и в моем шаблоне я получил:

{% csrf_token %}
{{ category_form.as_p  }}

На мой взгляд, я делаю

cat = Category.objects.get(pk = cat_id)
data['category_form'] = CategoryForm(instance = cat)

и передать данные в мой шаблон, который хорошо отображает форму, но идентификатор объекта, который я собираюсь обновить, отсутствует в источнике html. Как теперь может код, какой объект для обновления?

Я чувствую себя глупо, спрашивая об этом, поскольку это должно быть довольно просто, но я следовал всем учебным пособиям и просматривал документы django, гуглил и безуспешно искал этот сайт.

Заранее спасибо.

Ответы [ 4 ]

4 голосов
/ 14 июля 2010

Объяснение этому можно найти в документации django здесь: http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method

При попытке обновить уже сохраненную сущность вы должны предоставить параметр экземпляра при воссоздании формы.В противном случае django попытается вставить новую сущность.

foo_form = FooForm(request.POST, instance=foo)
4 голосов
/ 14 июля 2010

Откуда, по вашему мнению, cat_id?Я думаю, вы получите его в URL, например, так:

url( r'categories/(\d+)/edit/', your_view, {} ),

в urls.py где-то.Теперь, по вашему мнению, вы можете прочитать его из соответствующего аргумента функции представления:

def your_view( request, cat_id ):

Теперь вы можете получить объект с правильным идентификатором, что вы делаете здесь:

cat = Category.objects.get(pk = cat_id)

... исоздать экземпляр ModelForm, передав ему cat объект, если вы хотите отредактировать существующий объект, или не передавать его, если вам нужна пустая форма для создания объекта.

0 голосов
/ 14 июля 2010

Первичный ключ - это атрибут с именем "id" в вашем экземпляре объекта "cat".Сама форма и в вашем примере представлена ​​"cat_id".Форма Model должна позаботиться о том, чтобы отслеживать первичный ключ - все, что вам нужно сделать, это передать полученные данные «request.POST» обратно в CategoryForm, проверить данные с помощью is_valid () и затем сохранить их.

т.е.

form_with_post = CategoryForm(request.POST)
if form_with_post.is_valid():
    form_with_post.save()
else:
    ... return the form_with_post through the context to display the errors
0 голосов
/ 14 июля 2010

Идентификатор не обязательно должен быть в HTML, потому что вы передали экземпляр в объект формы при его создании. Django просто обновляет этот экземпляр, когда вы делаете form.save().

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