Django сортировка полей формы из двух моделей - PullRequest
0 голосов
/ 04 марта 2020

Я расширил пользовательскую модель Django некоторыми дополнительными полями

models.py

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    telephone = models.CharField(max_length=15, blank=True)
    email_address = models.CharField(max_length=30, blank=True)
    date_of_birth = models.DateField(null=True, blank=True)


@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)


@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()

forms.py

class ProfileForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ('telephone', 'email_address', 'date_of_birth')
        widgets = {
            'date_of_birth': forms.DateInput(attrs={'type': 'date'}),
        }

views.py

def response_form(request):
    if request.method == 'POST':
        user_form = UserForm(request.POST, instance=request.user)
        profile_form = ProfileForm(request.POST, instance=request.user.profile)

        if user_form.is_valid() and profile_form.is_valid():
            profile, created = Profile.objects.get_or_create(user=request.user)
            user_form.save()
            profile_form.save()
            messages.success(request, ('Your profile was successfully updated!'))
            date_of_birth = profile_form.cleaned_data['date_of_birth']
            user = profile_form.cleaned_data['user']

            context = {
                'user': user,
                'date_of_birth': date_of_birth
                }
            template = loader.get_template('thank_you.html')

            return HttpResponse(template.render(context, request))
        else:
            messages.error(request, ('Please correct the error below.'))
    else:
        user_form = UserForm()
        profile_form = ProfileForm()
    return render(request, 'response_form.html', {'user_form': user_form, 'profile_form': profile_form})

Когда шаблон загружен, он помещает пользовательские поля над полями профиля.

enter image description here

Как разместить раскрывающийся список Пользователь над полем Имя ?

1 Ответ

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

Поскольку вы смешиваете порядок полей в двух разных формах, вы не можете сделать это, пока еще используете {{ my_form.as_p }} или аналогичные методы для отображения ваших форм в шаблоне.

Вы должны визуализировать поля формы индивидуально, как объяснено здесь .

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

Также при успешном заполнении формы обычной практикой является перенаправление (302 REDIRECT) вашего пользователя на «спасибо» вместо просмотрите шаблон 'спасибо' (200 ОК). Это связано с тем, что страница refre sh (F5 или cmd-R) в противном случае повторно отправит данные.

...