我试图以最简单的方式在 django 中使用更新视图,但它没有被更新,而是在数据库中创建模型的新对象。我对另一个型号的 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']
Run Code Online (Sandbox Code Playgroud)
模板:
{% 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 %}
Run Code Online (Sandbox Code Playgroud)
网址.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'),
]
Run Code Online (Sandbox Code Playgroud)
模型:
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})
Run Code Online (Sandbox Code Playgroud)
好吧,正如其他人在评论中所说,您的视图创建新对象而不是更新,因为您有可编辑的主键。
您会看到,UndercoverUpdateView为您的模型创建表单并调用save该表单。
它是操作属性save的方法。如果 pk 没有找到实例,则会创建新实例。因此,我建议您使用不可编辑的主键重新创建模型,并将名称保留为简单的字符字段。BaseModelFormself.instance