2016-07-15 4 views
1

Я пытаюсь использовать представление обновления в django, простейшим образом, но он не обновляется, а в базе данных создается новый объект модели , Я сделал то же самое для другой модели Track, и ее работа отлично. Я чувствую, что это может быть что-то тривиальное, что может вызвать проблему.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

Я знаю, что должен был сделать автоматический приращение как ПК и имя Unique. Я просто пытаюсь. Но он все равно должен работать, не так ли? Или PK не редактируется здесь/или нам нужно настроить что-то, чтобы сделать его редактируемым. –

+1

Если ваш ПК является редактируемым полем и вы его редактируете, то Django не знает, что сохранение - это обновление, а не создание , –

ответ

2

Ну, как и другие люди, говорится в комментарии, ваше мнение создает новый объект вместо обновления, потому что у вас есть редактируемые первичный ключ.

Вы видите, undercover UpdateView создает форму для вашей модели и звонит save на этой форме.

Это save метод BaseModelForm, который управляет атрибутом self.instance. И если экземпляр не найден pk, новый будет создан. Поэтому я предлагаю вам воссоздать вашу модель с необработанным первичным ключом и оставить имя как простое поле символов.

+0

Ну, это вариант. Но разве это невозможно? за исключением, может быть, написания собственных запросов sql. Так что-то вроде этого происходит -> Объект, полученный по форме Отображается объект и отображаются только поля, указанные в views.py. (Объект сохраняется или новый объект, созданный из данных формы? Не должен содержать скрытые поля?) Объект сначала просматривается с отредактированным PK, а затем изменен или создан? –

+0

>>> Объект сначала просматривается с отредактированным ПК, а затем изменен или создан? Да, как иначе он найдет? Почему вам все равно нужно имя pk? – valignatev

+0

Я думал, что его, возможно, обыскали с более старым ПК, и тогда был бы снят запрос, который бы обновил запись с помощью нового ПК. Мне это совсем не нужно. Просто проверьте общие представления django. Я предполагаю, что редактирование PK не является хорошим выбором дизайна в любом сценарии. Лучше сделать имя уникальным, а не быть PK –

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

Таким образом, всякий раз, когда я представил форму, действие под названием MyViewView вместо моего UpdateView.