Я видел, что этот вопрос задал много времени здесь, но я не могу понять, почему это не работает в моем случае. У меня есть следующий код вида: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')
]
Можете ли вы показать модель CoffeeForm и Drink? –
Я отредактировал сообщение. Thx – Bertrand
Вы уверены, что 'coffee_id' передается в представление? Можете ли вы показать свои URL? – Alasdair