2016-09-08 14 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 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) 

飲食モデルです:編集**

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

**

は、URLを追加します。

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

コーヒーフォームとドリンクのモデル自体を表示できますか? –

+0

投稿を編集しました。 Thx – Bertrand

+0

'coffee_id'がビューに渡されていますか?あなたはあなたのURLを表示できますか? – Alasdair

答えて

0

get_object_or_404 get_object_or_404は、指定されたIDの飲み物が存在しない場合にエラーになります。

あなたは確かに/ edit/1に対して投稿が行われますか?フォームアクションにIDがない場合、新しいDrinkが作成されるためです。

別々の作成と編集のビューをお勧めします。おそらく、クラスベースのビューを使用しますが、あなたがそれらを使用しない理由がある場合は、このような何かは仕事ができる:

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

/edit/123に対して投稿していますか?おそらく、いくつかのprintステートメントでそれを理解することができます。 –

1

superを呼び出すときはCoffeeForm、ないModelFormを使用する必要があります。

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"を取り除いたときのことで、何も起こらないことがわかりました。私はあなたが同じテンプレートを使用していることを確認し、それもビューから変更しないので、これを行う必要があります。 あなたがこの投稿を解決できない場合は、テンプレートと私は助けてくれることを嬉しく思っています。 :)

関連する問題