2016-09-08 4 views
0

이 질문에 많은 시간을 보았지만 내 경우에는 작동하지 않는 이유를 알 수 없습니다. 이것은 커피의 새로운 인스턴스를 만들거나 데이터베이스에 존재 인수에 주어진 coffee_id 경우 새 하나를 업데이트하도록되어Django 양식은 기존 인스턴스를 업데이트하는 대신 새 인스턴스를 만듭니다.

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가 데이터베이스에 존재하더라도 항상 새로운 커피 인스턴스가 생성됩니다.

양식을 저장하지 않고 커피 인스턴스를 저장하려고했지만 동일한 작업을 수행했습니다.

내가 잘못하고있는 것이 있습니까? 업데이트 할 수 있도록 모델에 특별한 것을 설정해야합니까?

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

** 편집 **

이 URL을 추가 :

편집

이는 음료 형태

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) 

그리고 음료 모델

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 및 음료 모델 자체를 표시 할 수 있습니까? –

+0

나는 글을 편집했다. Thx – Bertrand

+0

'coffee_id'가보기로 전달되고 있습니까? 당신은 당신의 URL을 보여줄 수 있습니까? – Alasdair

답변

0

get_object_or_404 주어진 id의 음료가없는 경우 오류가 발생합니다.

게시 하시겠습니까?/edit/1에 대해 게시 하시겠습니까? 양식 작업에 ID가 없으므로 새 음료수가 만들어집니다.

보기를 별도로 만들고 편집하는 것이 좋습니다. 아마도 클래스 기반의 뷰를 사용하지만 이유가있을 경우이를 사용하지 않는,이 같은 뭔가 일할 수 : super를 호출 할 때 당신은 CoffeeForm하지 ModelForm를 사용해야합니다

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로 답을 작성합니다. 나는 그것을 편집하고 장고로 객체를 만들 수있는 단일보기를 가질 수있을 거라 생각했지만 어쩌면 그것은 좋은 패턴이 아니에요 ... 또한 나는 edit_coffee' 메서드 대신 생성 문제를 수정할 수있는 코드를 보지 않습니다. – Bertrand

+0

/edit/123에 대한 소식을 확인 하시겠습니까? 당신은 아마 몇 가지 print 문과 함께 그것을 알아낼 수 있습니다. –

1

.

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"을 제거했을 때였지만 아무 것도 볼 수 없었습니다. :) 나는 당신이 동일한 템플릿을 사용하고 있고보기에서 그것을 변경하지 않으므로 이것을해야 할 수도 있습니다. 이 게시물을 해결할 수 없다면 템플릿과 나는 장고를 배우는 데 도움이 될 수 있기 때문에 기꺼이 도와 드리겠습니다! :)

관련 문제