通过ModelForm更新模型实例:“unicode”对象没有属性“\u meta”

2024-10-03 17:29:10 发布

您现在位置:Python中文网/ 问答频道 /正文

免责声明:我读过this和其他一些相关的问题,但要么我不明白答案,要么讨论的问题实际上不同。在

在我的应用程序中,用户可以查看一个模型的实例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方法和一个元类。在

我使用的模型表单很简单:

^{pr2}$

相关视图如下(我现在不想使用基于类的视图):

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')

我从一个包含链接的页面调用视图

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

其中“kur”是一个Kurs。我的编辑课程.html包含以下内容:

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

不幸的是,当用户单击“编辑此课程”时,会出现AttributeError“unicode”对象没有属性“\u 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模型中添加一个空的''u meta'类吗?在


Tags: instance模型form视图编辑returnmodelsrequest
1条回答
网友
1楼 · 发布于 2024-10-03 17:29:10

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

您需要从数据库获取实例。快捷方式^{}对此很有用。注意,应该将实例传递给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})

相关问题 更多 >