views.py
def edit(request, question_id):
questioninfo = Question.objects.filter(id=question_id)
form = ModelForm(instance=questioninfo)
return render(request, "questions/edit.html", {"form": form})
models.py
class Question(models.Model):
question_add_user = models.ForeignKey(User, on_delete=models.CASCADE, default=1)
question_header = models.CharField(max_length=200, blank=False)
question_contetnt = models.TextField(max_length=1000)
question_add_date = models.DateTimeField(default=datetime.datetime.now)
question_p_id = models.CharField(max_length=200)
def __str__(self):
if len(self.question_contetnt) > 30:
return "[" + self.question_header + "] " + self.question_contetnt[0:30] + "..."
else:
return "[" + self.question_header + "] " + self.question_contetnt
urls.py
path('edit/<int:question_id>/', edit, name="edit"),
现在,当我尝试编辑/ 2时,例如我发现了这个错误:
/ errors / edit / 65 /中的AttributeError 'ModelForm'对象没有属性'_meta'
答案 0 :(得分:0)
在您的视图中,您构建了ModelForm
:
def edit(request, question_id):
questioninfo = Question.objects.filter(id=question_id)
form = ModelForm(instance=questioninfo)
return render(request, "questions/edit.html", {"form": form})
但是如果没有子类化它就不能使用ModelForm
:ModelForm
更像是一个基类,你可以创建一个适用于特定模型的表单。例如,我们可以构建一个QuestionForm
:
# forms.py
class QuestionForm(ModelForm):
class Meta:
model = Question
fields = ['question_add_user', 'question_header',
'question_content', 'question_add_date',
'question_p_id']
所以我们在这里指定表单适用于Question
个实例,并且我们还指定了使用该表单编辑的字段列表。
现在我们可以在视图中使用QuestionForm
:
# views.py
def edit(request, question_id):
questioninfo = Question.objects.filter(id=question_id)
form = QuestionForm(instance=questioninfo)
return render(request, "questions/edit.html", {"form": form})
请注意,您可以更改QuestionForm
中的更多元素。例如,在保存表单时或在验证输入是否有效时应运行的某些代码。您还可以指定只有值的子集应该是表单的一部分,等等。但默认实现通常已经可以定义在实现特定表单时可能遇到的大多数问题。