更新表单在 Django 中创建新对象
Update form creates new object in Django
我有一个 Trip
模型并创建了一个表格来更新现有行程。
models.py
:
class Trip(models.Model):
trip_id = models.CharField(max_length=20, verbose_name="Ref. Viagem")
destination = models.CharField(max_length=200, null=True, verbose_name='Destino')
client = models.ForeignKey(Clients, null=True, on_delete=models.CASCADE, verbose_name="Cliente")
out_flight = models.ForeignKey(Flight, related_name="outbound_flight" ,null=True, on_delete=models.SET_NULL, verbose_name="Voo Ida")
hotel = models.ForeignKey(Hotels, null=True, on_delete=models.SET_NULL, verbose_name="Hotel")
in_flight = models.ForeignKey (Flight, related_name="inbound_flight", null=True, on_delete=models.SET_NULL, verbose_name="Voo Regresso")
forms.py
:
class UpdateTrip(ModelForm):
def __init__(self, *args, **kwargs):
super(UpdateTrip, self).__init__(*args, **kwargs)
self.fields['trip_id'].widget = TextInput(attrs={'class': 'form-control'})
self.fields['destination'].widget = TextInput(attrs={'class': 'form-control'})
self.fields['client'].queryset = Clients.objects.all()
class Meta:
model = Trip
fields = ('trip_id', 'destination', 'client', 'out_flight', 'hotel', 'in_flight')
这是它的views.py
:
def trip_upd(request, trip_id):
if request.method == 'POST':
form = UpdateTrip(request.POST)
if form.is_valid():
form.save()
return redirect('trips')
else:
form = UpdateTrip()
return render(request, 'backend/trip_update.html', {'form': form})
我在测试时使用准系统形式:
<form method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="Submit">
</form>
现在,这不会更新对象,而是会创建一个新对象。
您需要通过instance=…
参数传递您要更新的实例:
def trip_upd(request, trip_id):
if request.method == 'POST':
<b>trip =</b> Trip.objects.get(trip_id=trip_id)
form = UpdateTrip(request.POST<b>, instance=trip</b>)
if form.is_valid():
form.save()
return redirect('trips')
else:
form = UpdateTrip()
return render(request, 'backend/trip_update.html', {'form': form})
或者您可以使用 get_object_or_404
function [Django-doc] 来 return HTTP 404 错误,以防对象不存在:
from django.shortcuts import get_object_or_404
def trip_upd(request, trip_id):
if request.method == 'POST':
trip = <b>get_object_or_404(</b>Trip, trip_id=trip_id<b>)</b>
form = UpdateTrip(request.POST, instance=trip)
if form.is_valid():
form.save()
return redirect('trips')
else:
form = UpdateTrip()
return render(request, 'backend/trip_update.html', {'form': form})
请注意,在表单中,您可以在 Meta
中指定小部件,这比在 __init__
中这样写更具声明性:
class UpdateTrip(ModelForm):
class Meta:
model = Trip
fields = ('trip_id', 'destination', 'client', 'out_flight', 'hotel', 'in_flight')
<b>widgets</b> = {
'trip_id': TextInput(attrs={'class': 'form-control'}),
'destination': TextInput(attrs={'class': 'form-control'})
}
我有一个 Trip
模型并创建了一个表格来更新现有行程。
models.py
:
class Trip(models.Model):
trip_id = models.CharField(max_length=20, verbose_name="Ref. Viagem")
destination = models.CharField(max_length=200, null=True, verbose_name='Destino')
client = models.ForeignKey(Clients, null=True, on_delete=models.CASCADE, verbose_name="Cliente")
out_flight = models.ForeignKey(Flight, related_name="outbound_flight" ,null=True, on_delete=models.SET_NULL, verbose_name="Voo Ida")
hotel = models.ForeignKey(Hotels, null=True, on_delete=models.SET_NULL, verbose_name="Hotel")
in_flight = models.ForeignKey (Flight, related_name="inbound_flight", null=True, on_delete=models.SET_NULL, verbose_name="Voo Regresso")
forms.py
:
class UpdateTrip(ModelForm):
def __init__(self, *args, **kwargs):
super(UpdateTrip, self).__init__(*args, **kwargs)
self.fields['trip_id'].widget = TextInput(attrs={'class': 'form-control'})
self.fields['destination'].widget = TextInput(attrs={'class': 'form-control'})
self.fields['client'].queryset = Clients.objects.all()
class Meta:
model = Trip
fields = ('trip_id', 'destination', 'client', 'out_flight', 'hotel', 'in_flight')
这是它的views.py
:
def trip_upd(request, trip_id):
if request.method == 'POST':
form = UpdateTrip(request.POST)
if form.is_valid():
form.save()
return redirect('trips')
else:
form = UpdateTrip()
return render(request, 'backend/trip_update.html', {'form': form})
我在测试时使用准系统形式:
<form method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="Submit">
</form>
现在,这不会更新对象,而是会创建一个新对象。
您需要通过instance=…
参数传递您要更新的实例:
def trip_upd(request, trip_id):
if request.method == 'POST':
<b>trip =</b> Trip.objects.get(trip_id=trip_id)
form = UpdateTrip(request.POST<b>, instance=trip</b>)
if form.is_valid():
form.save()
return redirect('trips')
else:
form = UpdateTrip()
return render(request, 'backend/trip_update.html', {'form': form})
或者您可以使用 get_object_or_404
function [Django-doc] 来 return HTTP 404 错误,以防对象不存在:
from django.shortcuts import get_object_or_404
def trip_upd(request, trip_id):
if request.method == 'POST':
trip = <b>get_object_or_404(</b>Trip, trip_id=trip_id<b>)</b>
form = UpdateTrip(request.POST, instance=trip)
if form.is_valid():
form.save()
return redirect('trips')
else:
form = UpdateTrip()
return render(request, 'backend/trip_update.html', {'form': form})
请注意,在表单中,您可以在 Meta
中指定小部件,这比在 __init__
中这样写更具声明性:
class UpdateTrip(ModelForm):
class Meta:
model = Trip
fields = ('trip_id', 'destination', 'client', 'out_flight', 'hotel', 'in_flight')
<b>widgets</b> = {
'trip_id': TextInput(attrs={'class': 'form-control'}),
'destination': TextInput(attrs={'class': 'form-control'})
}