Django modelform:用于插入和更新的单一视图?

时间:2018-06-20 07:23:43

标签: django django-views

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

1 个答案:

答案 0 :(得分:1)

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

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