Skip to main content
 首页 » 编程设计

python之Django之更新 View ,创建新对象而不是更新,

2024年10月17日36luoye11

我正在尝试以最简单的方式在 Django 中使用更新 View ,但它没有被更新,而是在数据库中创建了一个新的模型对象。我对另一个模型 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}) 

请您参考如下方法:

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

您看,卧底 UpdateView 为您的模型创建表单并调用该表单的 save。

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