我想用modelform在Django中更新的对象的主键在哪里?

2024-04-25 23:52:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我在django中使用modelform插入和更新数据库中的对象,但是当我尝试更新时,我看不到正在更新的对象的主键/id:

我的模型:

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)

然后将数据传递给我的模板,模板将表单呈现为ok,但是我要更新的对象的id在html源代码中不存在。那么代码现在怎么能更新什么对象呢?

我觉得问这个问题很愚蠢,因为它应该是非常基本的,但我已经遵循了所有的教程,浏览了django文档,搜索和搜索这个网站没有运气。

提前谢谢。


Tags: 对象djangonameform模板id数据库models
3条回答

在你看来,cat_id是从哪里来的?我猜你是通过网址收到的,比如:

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

在某处。现在在您的视图中,您可以从适当的视图函数参数中读取它:

def your_view( request, cat_id ):

现在您可以获取具有正确id的对象,您可以在此处执行以下操作:

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

…并实例化ModelForm传递它cat对象,如果您想要编辑现有对象,或者不传递它,如果您想要一个空表单来创建对象。

主键是实例对象“cat”上名为“id”的属性。表单本身,在您的示例中用“cat id”表示。模型表单应该注意跟踪主键-您只需要将结果“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

对此的解释可以在django文档中找到,这里是:http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method

尝试更新已保存的实体时,重新创建表单时必须提供实例参数。否则django将尝试插入一个新实体。

foo_form = FooForm(request.POST, instance=foo)

相关问题 更多 >