Замена значения одного поля формы другим - PullRequest
0 голосов
/ 26 апреля 2020

Я написал фрагмент кода, в котором пользователь может выбрать профессию из поля выбора (учитель, врач, пилот и т. Д. c), и если его профессия отсутствует в списке, он может выбрать «другое», а затем напишите их занятие в текстовом поле ниже.

Я могу успешно определить, выбрали ли они «другое» из выпадающего списка, но не могу понять, как заполнить поле «занятие» данными из поля «другое» .

if request.method == 'POST':
        form = OccupationForm(request.POST, request.FILES, instance=request.user.occupation)
        if form.is_valid():
            # if user selected 'other' - get input from text field
            if form['occupation'].value() == 'other':
                # this doesnt work
                #form_data = self.get_form_step_data(form)
                #form.other = form_data.get('other', '')
                #form.save()
                return redirect('#')

            #form.save()
            #return redirect('#')

    else:
        form = OccupationForm(instance=request.user.occupation)

Спасибо.

РЕДАКТИРОВАТЬ: сокращенные models.py

class Occupation(models.Model):
    # I just realized, maybe this should be OneToManyField ??
    user = models.OneToOneField(User, on_delete=models.CASCADE)

    OCCUPATIONS = (
        ('teacher', 'Teacher'),
        ('doctor', 'Doctor'),
        ('other', 'Other'),
    )

    occupation = models.CharField('What is your job?', max_length=200, null=True, choices=OCCUPATIONS)

сокращенные forms.py

class OccupationsForm(forms.ModelForm):
    other = forms.CharField(required=False, label='')

    def clean(self):
        cleaned_data = super().clean()
        if cleaned_data.get('occupations') == 'other':
            cleaned_data['occupations'] = cleaned_data.get('other')
        return cleaned_data

    class Meta:
        model = Occupations

        fields = ['occupations']

Спасибо

1 Ответ

0 голосов
/ 26 апреля 2020

Методы очистки вашей формы - это место, где вы проверяете и очищаете данные, отправляемые в форму, включая возможное изменение данных.

class OccupationForm(forms.ModelForm):

    ....

    def clean(self):
        cleaned_data = super().clean()
        if cleaned_data.get('occupation') == 'other':
            cleaned_data['occupation'] = cleaned_data.get('other')
        return cleaned_data

Теперь вы можете просто позвонить form.save сразу после form.is_valid, поскольку метод clean очистит / вернет правильные данные

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...