我是Django的新手,所以不确定最好的方法是什么。我正在使用ModelForm创建用于插入/更新的表单。但是,我的问题是,对于这两种操作,我应该拥有一个单一的视图,还是最好有两个单独的视图?
示例单独视图:
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。
答案 0 :(得分:1)
我将两个视图分开,但改用基于类的视图(CreateView
和UpdateView
)。这些视图已经实现了您当前在两个视图中复制的大多数功能。一个小例子:
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(), ..),
有关基于类的视图的更多信息,您可以阅读documentation。