Django 中使用同一表单处理模型创建和编辑

92 阅读3分钟

在 Django 中,我们经常需要创建和编辑模型对象。通常,我们会为每个操作创建一个单独的表单。然而,在某些情况下,我们可能希望使用同一表单来处理模型的创建和编辑。这可以使我们的代码更加简洁和易于维护。

2、解决方案

(1) 使用 ModelForm

我们可以使用 ModelForm 来实现这一目标。ModelForm 是 Django 提供的一个类,可以根据模型类自动生成表单。在我们的例子中,我们可以创建一个名为 CarFormModelForm,如下所示:

from django import forms
from .models import Car

class CarForm(forms.ModelForm):
    class Meta:
        model = Car
        fields = ('car',)

然后,我们可以在视图中使用 CarForm 来处理模型的创建和编辑。如下所示:

@csrf_protect
@login_required
def add_car(request):
    if request.method == 'POST':
        form = CarForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('car_list')
    else:
        form = CarForm()
    return render(request, 'add_car.html', {'form': form})

@csrf_protect
@login_required
def edit_car(request, car_id):
    car = get_object_or_404(Car, pk=car_id)
    if request.method == 'POST':
        form = CarForm(request.POST, instance=car)
        if form.is_valid():
            form.save()
            return redirect('car_list')
    else:
        form = CarForm(instance=car)
    return render(request, 'edit_car.html', {'form': form})

在上面的代码中,我们使用 CarForm 来处理模型的创建和编辑。对于创建操作,我们只需创建一个新的 CarForm 实例,并在 POST 请求中调用 form.is_valid()form.save() 方法即可。对于编辑操作,我们需要先获取要编辑的模型对象,然后创建一个新的 CarForm 实例,并将模型对象作为 instance 参数传递给 CarForm。这样,表单就会自动填充模型对象的数据。在 POST 请求中,我们调用 form.is_valid()form.save() 方法即可更新模型对象的数据。

(2) 使用 Form

如果我们不想使用 ModelForm,也可以使用 Form 来实现这一目标。但是,我们需要手动编写表单字段。在我们的例子中,我们可以创建一个名为 AddCarFormForm,如下所示:

from django import forms

class AddCarForm(forms.Form):
    car = forms.CharField(label='#', max_length=5, required=True, 
        widget=forms.TextInput(attrs={'class':'', 'title': '#', 
        'placeholder': '#', 'required': 'true'}))

然后,我们可以在视图中使用 AddCarForm 来处理模型的创建和编辑。如下所示:

@csrf_protect
@login_required
def add_car(request):
    if request.method == 'POST':
        form = AddCarForm(request.POST)
        if form.is_valid():
            car = Car(car=form.cleaned_data['car'])
            car.save()
            return redirect('car_list')
    else:
        form = AddCarForm()
    return render(request, 'add_car.html', {'form': form})

@csrf_protect
@login_required
def edit_car(request, car_id):
    car = get_object_or_404(Car, pk=car_id)
    if request.method == 'POST':
        form = AddCarForm(request.POST, instance=car)
        if form.is_valid():
            form.save()
            return redirect('car_list')
    else:
        form = AddCarForm(instance=car)
    return render(request, 'edit_car.html', {'form': form})

在上面的代码中,我们使用 AddCarForm 来处理模型的创建和编辑。对于创建操作,我们只需创建一个新的 AddCarForm 实例,并在 POST 请求中调用 form.is_valid()form.save() 方法即可。对于编辑操作,我们需要先获取要编辑的模型对象,然后创建一个新的 AddCarForm 实例,并将模型对象作为 instance 参数传递给 AddCarForm。这样,表单就会自动填充模型对象的数据。在 POST 请求中,我们调用 form.is_valid()form.save() 方法即可更新模型对象的数据。

希望这篇技术文章对您有所帮助。