好吧,让我们考虑一个场景,我们创造RecordsCategory 和更新/编辑RecordsCategory 使用 Django 表单。
假设你有一个模型如下:
class RecordsCategory(models.Model):
name = models.CharField(max_length=255, blank=True)
现在,让我们添加表单:
class RecordsCategoryForm(forms.ModelForm):
class Meta:
model = RecordsCategory
fields = '__all__'
def save(self):
record_category = super(RecordsCategoryForm, self).save(commit=False)
record_category.save()
return record_category
如果您观察保存方法,我们首先尝试获取记录类别对象而不将其保存到数据库中(通过commit=False)。这是为了确保应用程序不会引发IntegrityError(这意味着我们正在尝试保存到数据库而不输入/填写必填字段)。然后我们将它保存到数据库中。
让我们为create new record category 添加视图:
from django.views.generic import FormView
class NewRecordsCategoryView(FormView):
template_name = "blob/blob.html"
form_class = RecordsCategoryForm
def form_valid(self, form):
form.save()
return super(NewRecordCategoryView, self).form_valid(form)
def get_success_url(self, *args, **kwargs):
return reverse("some url name")
我们已经将NewRecordsCategoryView 的form_valid 方法覆盖为我们在上面覆盖的save() 方法。特别是由于我们无法访问模型/表单中的请求对象,我们需要传递给save() 方法。(我们也可以传递给__init__ 形式的方法,这是另一种方式)。
现在,让我们添加另一个视图来更新记录类别对象:
class EditRecordsCategoryView(UpdateView) #Note that we are using UpdateView and not FormView
model = RecordsCategory
form_class = RecordsCategoryForm
template_name = "blob/blob.html"
def form_valid(self, form): # here you should be redirected to the id which you want to change it.
form.save()
return super(EditRecordsCategoryView, self).form_valid(form)
def get_success_url(self, *args, **kwargs):
return reverse("some url name")
并使用这些网址:
...
path('record_category/create/', NewUserProfileView.as_view(), name="new-user-profile"),
path('record_category/(?P<pk>d+)/update/', EditUserProfileView.as_view(), name="edit-user-profile"),
...
以及使上述表单工作的基本 Django 模板:
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<input type=submit value="submit" />
</form>
参考: