2016-11-17 60 views
1

免責聲明:我已閱讀this和一些其他相關問題,但要麼我沒有理解答案或討論的問題實際上是不同的。通過ModelForm更新模型實例:'unicode'對象沒有屬性'_meta'

在我的應用程序中,用戶可以查看模型的實例Kurs或編輯它 - 我有兩個單獨的視圖爲這兩個行動。該模型的細節是航向對接如下:

class Kurs(models.Model): 
    prowadzacy = models.ForeignKey(User) 
    nazwa = models.CharField(max_length=200) 
    [skipping some fields...] 
    def __unicode__(self): 
     return self.nazwa 
    class Meta: 
     verbose_name_plural = "Kursy" 

因此,大家可以看到它有一個的Unicode方法和元級。

我使用的是的ModelForm這個簡單的一個:

class KursForm(ModelForm): 
class Meta: 
    model = Kurs 
    fields = "__all__"  

相關的觀點如下(我現在不想使用基於類的視角):

def editcourse(request, pk): 
    kurs_id = pk 
    if request.method=='POST': 
     form = KursForm(request.POST) 
     if form.is_valid(): 
      form.save() 
      return HttpResponseRedirect('/polls/usersite') 
    else: 
     form = KursForm(instance=pk) 

    return render(request, 'polls/editcourse.html', {"form" : form}) 

我的URL模式包含

url(r'^editcourse/(?P<pk>[0-9]+)/$', views.editcourse, name='editcourse') 

和我打電話從包含鏈接頁面視圖

<a href="{% url 'polls:editcourse' kur.id %}">EDIT THIS COURSE</a> 

其中「庫爾」是一個庫爾斯。我editcourse.html包含以下內容:

<form action="" method="post"> 
{% csrf_token %} 
{{ form }} 
<input type="submit" value="Submit" /> 
</form> 

不幸的是,當用戶點擊「編輯此課程」,會發生什麼情況是AttributeError的「統一」對象有沒有屬性「_meta」和最後幾行追溯是

File "[my path here]/views.py" in editcourse 
    84.   form = KursForm(instance=pk) 

File "/usr/local/lib/python2.7/dist-packages/Django-1.10.3-py2.7.egg/django/forms/models.py" in __init__ 
    282.    object_data = model_to_dict(instance, opts.fields, opts.exclude) 

File "/usr/local/lib/python2.7/dist-packages/Django-1.10.3-py2.7.egg/django/forms/models.py" in model_to_dict 
    87.  opts = instance._meta 

Exception Type: AttributeError at /polls/editcourse/6/ 
Exception Value: 'unicode' object has no attribute '_meta' 

我在做什麼錯?我應該爲我的Kurs模型添加一個空的'_meta'類嗎?

回答

1

在你的editcourse視圖中,pk不是kurs實例,它是一個帶有id的字符串(本例中爲'6')。

您需要從db中獲取實例。快捷方式get_object_or_404對此很有用。請注意,您應將實例傳遞給if語句的GETPOST分支中的表單。

from django.shortcuts import get_object_or_404 

def editcourse(request, pk): 
    kurs = get_object_or_404(Kurs, pk=pk) 
    if request.method=='POST': 
     form = KursForm(request.POST, instance=kurs) 
     if form.is_valid(): 
      form.save() 
      return HttpResponseRedirect('/polls/usersite') 
    else: 
     form = KursForm(instance=kurs) 

    return render(request, 'polls/editcourse.html', {"form" : form}) 
相關問題