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

时间:2016-07-15 09:25:34

标签: python django

我试图以最简单的方式在django中使用Update视图,但它没有被更新,而是在数据库中创建了一个新的模型对象。我为另一个模型Track做了同样的事情,它的工作正常。我觉得这可能是导致问题的微不足道的事情。

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

URLS.py

from django.conf.urls import url
from django.contrib import admin

''' View Imports '''
from views import TrackList
from views import AddTrack
from views import TrackDetail
from views import EditTrack

from views import GenreList
from views import GenreDetail
from views import AddGenre
from views import EditGenre


urlpatterns = [
    url(r'^tracks/', TrackList.as_view(),name='all-tracks'),
    url(r'^addTrack/', AddTrack.as_view(),name='add-tracks'),
    url(r'^editTrack/(?P<pk>[0-9]+)', EditTrack.as_view(),name='edit-track'),
    url(r'^track/(?P<pk>[0-9]+)', TrackDetail.as_view(),name='track'),

    url(r'^genres/', GenreList.as_view(),name='all-genres'),
    url(r'^addGenre/', AddGenre.as_view(),name='add-genre'),
    url(r'^editGenre/(?P<pk>[a-zA-Z0-9]+)', EditGenre.as_view(),name='genre'),
    url(r'^genre/(?P<pk>[a-zA-Z0-9]+)', GenreDetail.as_view(),name='genre'),
]

型号:

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})

2 个答案:

答案 0 :(得分:2)

好吧,正如其他人在评论中所说,您的视图会创建新对象而不是更新,因为您有可编辑的主键。

您可以看到,秘密UpdateView为您的模型创建表单并在该表单上调用save

运行save属性的BaseModelForm self.instance方法。如果pk找不到实例,则会创建新实例。因此,我建议您使用不可编辑的主键重新创建模型,并将名称保留为简单的字段。

答案 1 :(得分:0)

对于未来的访问者 - 我遇到了同样的问题,但没有可编辑的主键。在我的情况下,我重复使用CreateView和UpdateView的表单,忘了允许表单操作的差异:

<form role="form" class="form-horizontal" action="{% url createobject' %}" method="post" multipart/form-data">

但它应该是

{% if not object %}
<form role="form" class="form-horizontal" action="{% url 'object:createobject' %}" method="post" multipart/form-data">
{% else %}
<form role="form" class="form-horizontal" action="{% url 'object:updateobject' object.pk %}" method="post" enctype="multipart/form-data">
{% endif %}

因此,每当我提交表单时,操作都会调用我的Createview而不是UpdateView。