繁体   English   中英

更新表单在 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=…参数传递要更新的instance=…

def trip_upd(request, trip_id):
    if request.method == 'POST':
        trip = Trip.objects.get(trip_id=trip_id)
        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})

或者您可以使用get_object_or_404函数 [Django-doc]返回 HTTP 404 错误,以防对象不存在:

from django.shortcuts import get_object_or_404

def trip_upd(request, trip_id):
    if request.method == 'POST':
        trip = get_object_or_404(Trip, trip_id=trip_id)
        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')
        widgets = {
            'trip_id': TextInput(attrs={'class': 'form-control'}),
            'destination': TextInput(attrs={'class': 'form-control'})
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM