Python Django-更新视图,创建新对象而不是更新,
我试图以最简单的方式在django中使用updateview,但它并没有被更新,而是在数据库中创建了模型的一个新对象。我已经为另一个模型轨道做了同样的事情,它工作得很好。我觉得可能是一些琐碎的事情导致了这个问题 我在这里修改模型的PK。这可能是原因吗 查看:Python Django-更新视图,创建新对象而不是更新,,python,django,Python,Django,我试图以最简单的方式在django中使用updateview,但它并没有被更新,而是在数据库中创建了模型的一个新对象。我已经为另一个模型轨道做了同样的事情,它工作得很好。我觉得可能是一些琐碎的事情导致了这个问题 我在这里修改模型的PK。这可能是原因吗 查看: from django.views.generic.edit import UpdateView from musictracker.models.datamodels.Genre import Genre cla
from django.views.generic.edit import UpdateView
from musictracker.models.datamodels.Genre import Genre
class EditGenre(UpdateView):
model = Genre
template_name = "editGenre.html"
fields = ['name']
{% extends 'base.html' %} {% load addcss %} {% block content %}
<div id="regContainer">
<ul>
<!-- {% if form.errors %} {{form.errors}} {% endif %} -->
</ul>
<div class="form-group">
<form method="post" action="">
{% csrf_token %}
{% for field in form %}
<label class="control-label" for="form-control input-sm">{{field.label_tag }}</label>
<br /> {{field|addcss:"form-control input-sm"}}
<br />
{% endfor %}
<input type="submit" id="register" value="Edit Genre" class="btn btn-default">
</form>
</div>
</div>
{% endblock %}
class Genre(models.Model):
'''
This is a model for Genres
'''
name = models.CharField(max_length=20,primary_key=True,editable=True)
songcount = models.IntegerField()
def __unicode__(self):
return self.name
def get_absolute_url(self):
return reverse('genre', kwargs={'pk': self.pk})
模板:
from django.views.generic.edit import UpdateView
from musictracker.models.datamodels.Genre import Genre
class EditGenre(UpdateView):
model = Genre
template_name = "editGenre.html"
fields = ['name']
{% extends 'base.html' %} {% load addcss %} {% block content %}
<div id="regContainer">
<ul>
<!-- {% if form.errors %} {{form.errors}} {% endif %} -->
</ul>
<div class="form-group">
<form method="post" action="">
{% csrf_token %}
{% for field in form %}
<label class="control-label" for="form-control input-sm">{{field.label_tag }}</label>
<br /> {{field|addcss:"form-control input-sm"}}
<br />
{% endfor %}
<input type="submit" id="register" value="Edit Genre" class="btn btn-default">
</form>
</div>
</div>
{% endblock %}
class Genre(models.Model):
'''
This is a model for Genres
'''
name = models.CharField(max_length=20,primary_key=True,editable=True)
songcount = models.IntegerField()
def __unicode__(self):
return self.name
def get_absolute_url(self):
return reverse('genre', kwargs={'pk': self.pk})
正如其他人在评论中所说,视图创建新对象而不是更新,因为您有可编辑的主键 你们看,undercover
UpdateView
为你们的模型创建表单,并在表单上调用save
这是
BaseModelForm
的save
方法,它操作self.instance
属性。若pk找不到实例,将创建一个新实例。因此,我建议您使用不可编辑的主键重新创建模型,并将名称保留为简单的字符字段。对于未来的访问者,我遇到了相同的问题,但没有可编辑的主键。在我的例子中,我为CreateView和UpdateView重用了一个表单,但忘了考虑表单操作的差异:
<form role="form" class="form-horizontal" action="{% url createobject' %}" method="post" multipart/form-data">
{%else%}
{%endif%}
因此,每当我提交表单时,操作都会调用我的Createview而不是我的UpdateView。为什么要将
名称字段设置为主键?不要那样做。我知道我应该做一个自动递增的PK,并且名称是唯一的。我只是在尝试。但它应该仍然有效,不是吗?或者PK在此不可编辑/或者我们是否需要配置一些东西使其可编辑如果您的PK是可编辑字段,并且您对其进行了编辑,那么Django无法知道保存是更新而不是创建。我建议该字段可编辑。在模型中使用可编辑的true。但它仍然在创建新对象,复制其他字段的值。(songcount)嗯,这是一个选项。但是没有办法做到这一点吗?除了编写自己的sql查询。这样的情况会发生->显示表单对象获取的对象,并且只显示views.py中提到的字段。(对象被持久化或从表单数据创建新对象?表单不应该有隐藏字段吗?)首先使用编辑的PK搜索对象,然后修改或创建???>>首先使用编辑的PK搜索对象,然后修改或创建??是的,它会找到其他的方法吗?你为什么还要用pk来命名呢?我想它可能是用旧的pk搜索的,然后一个查询就会被截取,用新的pk来更新记录。我并不需要它。只是检查django的一般视图。我想在任何情况下,使PK可编辑都不是一个好的设计选择。更好地使名称唯一,而不是成为PKMaking Name just unique更好,你是对的。