免责声明:我已阅读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'类吗?
答案 0 :(得分:1)
在editcourse
视图中,pk
不是kurs
实例,而是带有ID的字符串(在本例中为'6'
)。
您需要从数据库中获取实例。快捷方式get_object_or_404
对此非常有用。请注意,您应该将实例传递给if语句的GET
和POST
分支中的表单。
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})