2016-07-15 109 views
1

我想在django中以最簡單的方式使用更新視圖,但它沒有被更新,而是正在數據庫中創建模型的新對象。我爲另一個模型軌道做了同樣的事情,它的工作正常。我覺得這可能是微不足道的,可能會導致問題。Django - 更新視圖,創建新的對象,而不是更新,

我在這裏修改模型的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

你爲什麼要將'name'字段設置爲主鍵?不要這樣做。 –

+0

我知道我應該做一個自動增量作爲PK和名稱唯一。我只是在嘗試。但它應該仍然有效,不是嗎?或者PK是不可編輯的,或者我們需要配置某些內容以使其可編輯 –

+1

如果您的PK是可編輯的字段並且您編輯了它,那麼Django無法知道保存是更新而不是創建。 –

回答

2

嗯,因爲其他人的評論說,你的觀點創造了新的對象,而不是更新,因爲您可編輯的主鍵。

您會看到,臥底UpdateView爲您的模型創建表單並在該表單上調用save

它是save方法BaseModelForm它運行self.instance屬性。如果pk沒有找到實例,則會創建新的實例。因此,我建議您使用不可編輯的主鍵重新創建模型,並將名稱保留爲簡單的char字段。

+0

那麼,這是一個選項。但是沒有辦法可以做到這一點?除了可能編寫自己的sql查詢。 因此,類似這樣的事情發生 - > 通過表單獲取的對象 顯示對象並僅顯示views.py中提到的字段。 (該對象是持久的,或者從表單數據創建的新對象不應該形成具有隱藏字段呢?) 對象首先用編輯後的PK搜索,然後修改或創建? –

+0

>>>首先用編輯後的PK搜索對象,然後修改或創建? 是的,它會如何找到其他方式?無論如何,你爲什麼需要名稱爲PK? – valignatev

+0

我以爲它可能已經用舊的PK進行搜索,然後一個查詢就會被拍攝出來,它會用新的PK更新記錄。我並不完全需要它。只需檢查django的通用視圖。我猜想在任何情況下讓PK編輯並不是一個好的設計選擇。更好地使名稱獨一無二,而不是成爲PK –

0

對於未來的訪問者 - 我遇到同樣的問題,但沒有可編輯的主鍵。在我來說,我重用的形式既CreateView的和更新視圖,忘了允許在表單動作的區別:

<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。

相關問題