2016-11-17 64 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}) 
相关问题