Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django-更新视图,创建新对象而不是更新,_Python_Django - Fatal编程技术网

Python Django-更新视图,创建新对象而不是更新,

Python Django-更新视图,创建新对象而不是更新,,python,django,Python,Django,我试图以最简单的方式在django中使用updateview,但它并没有被更新,而是在数据库中创建了模型的一个新对象。我已经为另一个模型轨道做了同样的事情,它工作得很好。我觉得可能是一些琐碎的事情导致了这个问题 我在这里修改模型的PK。这可能是原因吗 查看: from django.views.generic.edit import UpdateView from musictracker.models.datamodels.Genre import Genre cla

我试图以最简单的方式在django中使用updateview,但它并没有被更新,而是在数据库中创建了模型的一个新对象。我已经为另一个模型轨道做了同样的事情,它工作得很好。我觉得可能是一些琐碎的事情导致了这个问题

我在这里修改模型的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})
模板:

    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更好,你是对的。