Как я могу загрузить форму с исходными данными? - PullRequest
0 голосов
/ 20 мая 2019

Я создаю пользовательскую UserChangeForm и устанавливаю для всех полей значение required = False, а затем, когда пользователь меняет одно поле в этой форме, вся информация в базе данных изменяется, и если пользователь покидает одно поле, его поле обновляется до пустого.Мне нужно только изменить поле, которое пользователь ввел в форму, а другие поля в базе данных не изменились.

Я пытался:

    class UserInfoChangeForm(UserChangeForm):

        last_name = forms.CharField(label="",max_length=100,required=False)
        username = forms.CharField(label="", required=False)
        channel_name = forms.CharField(label="",max_length=100,required=False)

        class Meta:
            model = CustomUser
            fields = ('username', 'channel_name','last_name')

        def __init__(self, *args, **kwargs):
           '
            super(UserChangeForm, self).__init__(*args, **kwargs)
            self.fields.pop('password', 'email')

my views.py:

def update(request):

    if request.method == 'POST':

        form = UserInfoChangeForm(request.POST)
        if form.is_valid():
            form.save()
    else:
        form = UserInfoChangeForm()
    return render(request,'home/update.html',{'userupdate':UserInfoChangeForm})

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Вы можете передать экземпляр модели в форму, чтобы он заполнил все поля существующими значениями.Таким образом, пользователь может изменять любые поля, которые ему нравятся.Другим преимуществом этого является то, что он позволяет пользователю очистить значение поля, если они хотят.

def update(request):
    if request.method == 'POST':

        form = UserInfoChangeForm(request.POST, instance=request.user)
        if form.is_valid():
            form.save()
    else:
        form = UserInfoChangeForm(instance=request.user)
    return render(request,'home/update.html', {'userupdate': UserInfoChangeForm})
1 голос
/ 20 мая 2019

Вам не нужно переопределять инициализацию формы, вместо этого вы можете перезаписать метод сохранения формы, чтобы обновлять только нужные поля.

Например:

def save(self, commit=True):
    if self.is_valid():
        # Get instance with self.instance & only update if a value's changed:
        for field_name in self.fields:
            if getattr(self.instance, field_name) != self.cleaned_data[field_name]:
                setattr(self.instance, field_name, self.cleaned_data[field_name])
                self.instance.save()
    return self.instance
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...