2016-07-15 24 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と名前Uniqueとしてオートインクリメントを作ったはずです。私は物事を試みているだけです。しかし、それはまだ動作するはずですね。または、ここでPKを編集できないか、または編集可能にするために何かを設定する必要があります –

+1

あなたのPKが編集可能なフィールドで編集している場合、Djangoは保存が作成ではなく更新であることを知る方法がありません。 –

答えて

2

他の人々がコメントで言ったように、あなたが編集可能な主キーを持っているので、まあ、あなたのビューは、新しいオブジェクトの代わりに、更新を作成します。

あなたは、アンダーカバーUpdateViewがあなたのモデルのフォームを作成し、そのフォームにsaveを呼び出していることがわかります。

BaseModelFormsaveメソッドは、self.instance属性を処理します。インスタンスがpkによって見つからない場合は、新しいインスタンスが作成されます。だから私はあなたのモデルを編集不可能な主キーで再現し、名前を単なるcharフィールドとして残すことをお勧めします。

+0

これはオプションです。しかし、これを行う方法はありませんか?多分自分のSQLクエリを書くことを除いて。 このようなことが起こります - > オブジェクトがフォーム によってフェッチされました。オブジェクトが表示され、views.pyに記載されているフィールドのみが表示されます。 (オブジェクトが永続化されているか、フォームデータから作成された新しいオブジェクトにフィールドを隠してはいけませんか?) 編集されたPKでオブジェクトが検索され、変更または作成されますか? –

+0

>>>最初に編集されたPKでオブジェクトが検索され、その後変更または作成されますか? はい、どのように他の方法で見つけることができますか?とにかくpkとして名前が必要なのはなぜですか? – valignatev

+0

私はそれが古いPKで検索されている可能性があり、新しいPKでレコードを更新したクエリが撮影されたと考えました。私はそれを必要としません。 djangoの一般的なビューをチェックするだけです。私は、PKを編集可能にすることはどんなシナリオでも良いデザインの選択ではないと思う。 PKよりもむしろ名前のユニークなものを作ること –

0

私は同じ問題を経験しましたが、編集可能な主キーはありませんでした。 、

<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の両方のためにフォームを再利用し、フォームアクションの違いを許容するために忘れてしまいましたそのアクションは私のUpdateViewの代わりに私のCreateviewと呼ばれていました。

関連する問題