2016-09-08 90 views
0

我見過這個問題在這裏問了很多時間,但我不明白爲什麼它不起作用在我的情況。 我有以下看法代碼: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給存在於數據庫更新一個新的。

但即使數據庫中存在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) 

**編輯**

添加網址:

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'被傳遞給視圖嗎?你可以展示你的網址嗎? – Alasdair

回答

0

get_object_or_404錯誤如果具有給定ID的飲料不存在。

您確定POSTing是針對/ edit/1完成的嗎?因爲如果表單操作沒有該ID,則會創建一個新的飲料。

我建議你去單獨創建和編輯視圖。可能使用基於類的意見,但如果你的理由不使用它們,像這樣可以工作:

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

看看你是在POST /編輯/ 123?你可以用一些打印語句來弄明白。 –

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",我看到沒有任何反應:)。我發現您使用的是相同的模板,並未從視圖中更改,因此您可能還需要這樣做。 如果你不能解決這個帖子你的模板,我很樂意提供幫助,因爲它可以幫助我學習django! :)

相關問題