Django modelform:用于插入和更新的单个视图?
我是Django的新手,不知道最好的方法是什么。我正在使用ModelForm创建用于插入/更新的表单。然而,我的问题是,对于这两个操作,我是应该有一个单一的视图,还是最好有两个单独的视图 单独视图示例:Django modelform:用于插入和更新的单个视图?,django,django-views,Django,Django Views,我是Django的新手,不知道最好的方法是什么。我正在使用ModelForm创建用于插入/更新的表单。然而,我的问题是,对于这两个操作,我是应该有一个单一的视图,还是最好有两个单独的视图 单独视图示例: def insert(request): form = ModelForm(request.POST or None) if form.is_valid(): form.save() return redirect('next_view')
def insert(request):
form = ModelForm(request.POST or None)
if form.is_valid():
form.save()
return redirect('next_view')
context = { 'form': form}
return render(request, 'modelform.html', context)
def update(request, id):
instance = Model.objects.get(id=id)
form = ModelForm(request.POST or None, instance=instance)
if form.is_valid():
form.save()
return redirect('next_view')
context = { 'form': form}
return render(request, 'modelform.html', context)
单个视图示例
def modelform(request, id=False):
if id:
instance = Model.objects.get(id=id)
form = ModelForm(request.POST or None, instance=instance)
else:
form = ModelForm(request.POST or None)
if form.is_valid():
form.save()
return redirect('next_view')
context = { 'form': form}
return render(request, 'modelform.html', context)
推荐的方法是什么?我觉得组合视图更简单,但不确定这样做的最佳方式是什么。此外,如果对该代码有任何其他评论,请让我知道
使用Django 2.0 我会将这两个视图分开,但使用基于类的视图(和)。这些视图已经实现了您当前在两个视图中复制的大部分功能。一个小例子:
from django.views.generic import CreateView, UpdateView
class ModelCreateView(CreateView):
model = Model
form_class = ModelForm
success_url = reverse('next_view')
template_name = 'modelform.html'
class ModelUpdateView(UpdateView):
model = Model
form_class = ModelForm
success_url = reverse('next_view')
template_name = 'modelform.html'
使用此解决方案,您需要对URL进行一个小的更改。而不是像:
path('model/create/', views.insert, ..),
path('model/<int:pk>/update/', views.update, ..),
path('model/create/', views.ModelCreateView.as_view(), ..),
path('model/<int:pk>/update/', views.ModelCreateView.as_view(), ..),
path('model/create/',views.insert,…),
路径('model//update/',views.update,…),
您现在需要编写以下内容:
path('model/create/', views.insert, ..),
path('model/<int:pk>/update/', views.update, ..),
path('model/create/', views.ModelCreateView.as_view(), ..),
path('model/<int:pk>/update/', views.ModelCreateView.as_view(), ..),
path('model/create/',views.ModelCreateView.as_view(),…),
路径('model//update/',views.ModelCreateView.as_view(),…),
有关基于类的视图的更多信息,请阅读。非常感谢,我不知道这种方法!我现在正在调查。。。