gpt4 book ai didi

python - 通过 ModelForm 更新模型实例 : 'unicode' object has no attribute '_meta'

转载 作者:太空宇宙 更新时间:2023-11-03 15:57:33 25 4
gpt4 key购买 nike

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

在我的应用程序中,用户可以查看模型 Kurs 的实例或对其进行编辑 - 对于这两个操作,我有两个单独的 View 。模型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__"

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

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

我正在从包含链接的页面调用 View

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

不幸的是,当用户单击“编辑此类(class)”时,会发生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”类吗?

最佳答案

在您的 editcourse View 中,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})

关于python - 通过 ModelForm 更新模型实例 : 'unicode' object has no attribute '_meta' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40649918/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com