2016-09-08 5 views
0

Я видел, что этот вопрос задал много времени здесь, но я не могу понять, почему это не работает в моем случае. У меня есть следующий код вида:Django form создает новый экземпляр вместо обновления существующего

def edit(request, coffee_id=None): 
coffee = get_object_or_404(Drink, pk=coffee_id) if coffee_id else Drink() 
if request.method == 'POST': 
    form = CoffeeForm(request.POST, instance=coffee) 
    if form.is_valid(): 
     form.save() 
     return HttpResponseRedirect(urlresolvers.reverse('coffee:index')) 
else: 
    form = CoffeeForm(instance=coffee) 

return render(request, 'edit.html', {'coffee_form': form}) 

Это, как предполагается создать новый экземпляр кофе или обновить новый, если coffee_id дан в аргументе существует в базе данных.

Однако, даже если coffee_id существует в базе данных, всегда создается новый экземпляр кофе.

Я также попытался сохранить экземпляр кофе без сохранения формы, но он делает то же самое.

Есть ли что-то, что я делаю неправильно? Должен ли я установить что-то особенное в модели, чтобы разрешить обновление?

Редактировать

Это форма Drink

class CoffeeForm(forms.ModelForm): 
class Meta: 
    model = Drink 
    fields = ('time', 'location', 'type') 

def __init__(self, *args, **kwargs): 
    super(forms.ModelForm, self).__init__(*args, **kwargs) 

    coffee_category = Category.objects.get(name='coffee') 
    coffee_drink_types = DrinkType.objects.filter(category=coffee_category.id) 
    self.fields['type'].choices = ((x.id, str(x)) for x in coffee_drink_types) 

И Drink модель:

class Drink(models.Model): 
    time = models.DateTimeField('time', default=datetime.datetime.now) 
    location = models.ForeignKey(Location) 
    type = models.ForeignKey(DrinkType) 

** Редактировать **

Добавить URLs:

urlpatterns = [ 
    url(r'^$', views.index, name='index'), 
    url(r'^edit/$', views.edit, name='edit'), 
    url(r'^edit/(?P<coffee_id>[0-9]*)/$', views.edit, name='edit') 
] 
+0

Можете ли вы показать модель CoffeeForm и Drink? –

+0

Я отредактировал сообщение. Thx – Bertrand

+0

Вы уверены, что 'coffee_id' передается в представление? Можете ли вы показать свои URL? – Alasdair

ответ

0

get_object_or_404 ошибки, если напиток с данным идентификатором не существует.

Вы уверены, что POSTING сделан против/edit/1? Поскольку, если в действии формы нет идентификатора, создается новый напиток.

Я бы порекомендовал вам перейти с отдельными видами создания и редактирования. Возможно использовать представления на основе класса, но если у вас есть причины, чтобы не использовать их, что-то подобное может работать:

def create_coffee(request): 
    if request.method == 'POST': 
     form = CoffeeForm(request.POST) 
     if form.is_valid(): 
      coffee = form.save() 
      return redirect(reverse('edit_coffee', kwargs={'coffee_id': coffee.pk})) 
    else: 
     form = CoffeeForm() 

    return render(request, 'create.html', {'coffee_form': form}) 


def edit_coffee(request, coffee_id=None): 
    coffee = Drink.objects.filter(pk=coffee_id).first() 
    if not coffee: 
     return redirect(reverse('create_coffee')) 
    else: 
     if request.method == 'POST': 
      form = CoffeeForm(request.POST, instance=coffee) 
      if form.is_valid(): 
       form.save() 
     else: 
      form = CoffeeForm(instance=coffee) 

     return render(request, 'edit.html', {'coffee_form': form}) 
+0

Thx для вашего ответа. Я подумал, что можно было бы иметь один вид для редактирования и создания объектов с помощью django, но, возможно, это не очень хороший шаблон ... Также я не вижу код в методе 'edit_coffee', который мог бы исправить создание, а не проблему обновления. – Bertrand

+0

Посмотрите, используете ли вы POSTing против/edit/123? Вероятно, вы можете понять это с помощью нескольких заявлений на печать. –

1

Вы должны использовать CoffeeForm, не ModelForm при вызове super.

class CoffeeForm(forms.ModelForm): 
    class Meta: 
     model = Drink 
     fields = ('time', 'location', 'type') 

    def __init__(self, *args, **kwargs): 
     super(CoffeeForm, self).__init__(*args, **kwargs) 
+0

Вы правы, за ваше замечание. Однако у меня все еще есть новые записи :) – Bertrand

0

Не знаю, продолжаете ли вы по-прежнему проверять эту проблему, я нашел это для поиска этой же проблемы, и мне удалось это решить. В моем случае проблема заключалась в том, что я использовал один и тот же шаблон как для новых, так и для существующих объектов, и форма возвращалась и создавала новые экземпляры. В этот момент я решил создать несколько представлений с несколькими шаблонами.

Точка, в которой я попал, была, когда я удалил action="/add" из своей формы, и я увидел, что ничего не происходит :). Я вижу, что вы используете одни и те же шаблоны и не меняете их из представления, поэтому вам также может понадобиться сделать это. Если вы не можете решить эту тему, разместите свой шаблон (ы), и я буду рад помочь, потому что это может помочь мне, а также изучать django! :)

Смежные вопросы