2016-11-17 1 views
1

免責事項:thisとその他の関連する質問がありますが、 。ModelForm: 'unicode'オブジェクトを使用してモデルインスタンスを更新する場合、 '_meta'属性はありません

私のアプリでは、ユーザーはモデルKursのインスタンスを表示したり編集したりすることができます。私は2つのアクションについて2つのビューを持っています。次のようにモデルの詳細は、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" 

だから、あなたはそれがユニコード方法とメタクラスを持って見ることができるように。

私が使用しているの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}) 

私のurlpatternsは

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

が含まれていると私はリンクが含まれているページからビューを呼んでいる「kur」は、Kursである。

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

ユーザーが「EDIT THIS COURSE」をクリック残念なことに、何が起こることははAttributeError「ユニコード」オブジェクトが属性「_meta」との最後の数行を持っていないです:私のeditcourse.htmlには、以下が含まれていますトレースバックは

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ビューでは、pkkursインスタンスではなく、id(この場合は'6')の文字列です。

dbからインスタンスをフェッチする必要があります。ショートカットはget_object_or_404です。 if文のGETとブランチのフォームにインスタンスを渡す必要があることに注意してください。

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}) 
関連する問題