2010-07-14 56 views
3

我使用的ModelForm Django中在我的数据库中插入和更新的对象,但是当我尝试更新,我不能看到对象的主键/ ID被更新:我想使用modelform在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) 

并将数据传递到我的模板,这使得形式确定,但对象我即将更新的ID是无处在HTML源代码。那么代码如何才能现在更新什么对象?

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

在此先感谢。

回答

0

主键是实例对象“cat”上的一个名为“id”的属性。表单本身,在你的例子中用“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

ID不需要在HTML中,因为您在实例化它时已将实例传递给表单对象。当你做form.save()时,Django只是更新这个实例。

4

哪里是cat_id从您的视图来吗?我猜你收到它的URL,像这样:

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

urls.py地方。

def your_view(request, cat_id): 

现在,您可以获取对象与正确的ID,你在这里做:现在,在你看来,你可以从相应的视图函数的参数读取它

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

...和实例ModelForm传递cat对象如果您想编辑现有对象,或者不传递它,如果您想要创建对象的空表单。