如何创建编辑表单以编辑Django中的数据条目

时间:2018-05-20 18:59:08

标签: django django-forms

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'

1 个答案:

答案 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})

但是如果没有子类化它就不能使用ModelFormModelForm更像是一个基类,你可以创建一个适用于特定模型的表单。例如,我们可以构建一个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中的更多元素。例如,在保存表单时或在验证输入是否有效时应运行的某些代码。您还可以指定只有值的子集应该是表单的一部分,等等。但默认实现通常已经可以定义在实现特定表单时可能遇到的大多数问题。