Должна ли форма обновления в Django обновлять все поля объекта? - PullRequest
0 голосов
/ 10 марта 2020

Я создал несколько форм обновления в своем приложении Django.

Мой вопрос: Django нужно обновлять каждое отдельное поле объекта или есть способ обновить только те поля, которые были действительно изменены?

Так, например, у меня может быть форма с Airport Name, Airport City, Airport Country. И я мог бы использовать форму обновления для обновления Country. Нужно ли Django также заполнять поля формы Name и City и затем обновлять их, или есть способ оставить их пустыми и не обновлять базу данных?

РЕДАКТИРОВАТЬ

Это модель:

class Airport(models.Model):
    airport_name = models.CharField(max_length=200, verbose_name="Aeroporto")
    airport_city = models.CharField(max_length=200, verbose_name="Cidade")
    airport_country = models.CharField(max_length=200, verbose_name="País")

И форма:

class UpdateAirport(ModelForm):

    def __init__(self, *args, **kwargs):
        super(UpdateAirport, self).__init__(*args, **kwargs)
        self.fields['airport_name'].widget = TextInput(attrs={'class': 'form-control'})
        self.fields['airport_city'].widget = TextInput(attrs={'class': 'form-control'})
        self.fields['airport_country'].widget = TextInput(attrs={'class': 'form-control'})


    class Meta:
        model = Airport
        fields = ('airport_name', 'airport_city', 'airport_country' )

И мой взгляд:

@login_required(login_url='../accounts/login/')
def airport_upd(request, id):
    ts = Airport.objects.get(id=id)
    if request.method == 'POST':
        form = UpdateAirport(request.POST, instance=ts)
        if form.is_valid():
            form.save()
            return redirect('flights')
    else:
        form = UpdateAirport(initial={'airport_name': ts.airport_name, 'airport_city': ts.airport_city, 'airport_country': ts.airport_country})
    return render(request, 'backend/aiport_update.html', {'form': form, 'ts': ts})

И я пользуюсь Postgresql.

Ответы [ 3 ]

0 голосов
/ 10 марта 2020

Вы можете написать свою собственную проверку формы, переопределив существующую

def form_valid(self, form):
    clean = form.cleaned_data
    airport_name = clean.get('airport_name')
    airport_city = clean.get('airport_city')
    if airport_name:
        form.instance.airport_name = airport_name
    if airport_city:
        form.instance.airport_city = airport_city

    return super(UpdateAirport, self).form_valid(form)

Убедитесь, что эти поля не являются обязательными

0 голосов
/ 10 марта 2020

С подклассом UpdateView можно заменить метод form_valid.

def form_valid(self, form):
    self.object = form.save( commit = False)
    self.object.save( update_fields=['name', ... ])  # save only the specified fields
    return HttpResponseRedirect(self.get_success_url())

Бесценный справочник: Классические CBV

0 голосов
/ 10 марта 2020

Когда вы создаете новую строку в таблице Airport, поля не могут быть пустыми или пустыми, поскольку они обязательны, но при обновлении этой строки вам не нужно заполнять все поля, если они уже имеют значение

...