通过ModelForm更新模型实例:'unicode'对象没有属性'_meta'

时间:2016-11-17 08:27:51

标签: python django

免责声明:我已阅读this和其他一些相关问题,但要么我不理解答案,要么讨论的问题实际上有所不同。

在我的应用中,用户可以查看模型的实例 Kurs 或对其进行编辑 - 我对这两个操作有两个单独的视图。模型 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 方法和一个Meta类。

我正在使用的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(r'^editcourse/(?P<pk>[0-9]+)/$', views.editcourse, name='editcourse')

我正在从包含链接

的页面调用该视图
<a href="{% url 'polls:editcourse' kur.id %}">EDIT THIS COURSE</a>

其中“kur”是 Kurs 。我的editcourse.html包含以下内容:

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

不幸的是,当用户点击“编辑这个课程”时,会发生什么是 AttributeError'unicode'对象没有属性'_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 个答案:

答案 0 :(得分:1)

editcourse视图中,pk不是kurs实例,而是带有ID的字符串(在本例中为'6')。

您需要从数据库中获取实例。快捷方式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})