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')

我是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

我会将这两个视图分开,但使用基于类的视图(和)。这些视图已经实现了您当前在两个视图中复制的大部分功能。一个小例子:

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(),…),

有关基于类的视图的更多信息,请阅读。

非常感谢,我不知道这种方法!我现在正在调查。。。