Django: новое поле не отображается в форме после добавления его в модель - PullRequest
0 голосов
/ 28 марта 2019

После добавления нового поля в мою модель, оно не отображается в форме.

Я работал над этим приложением django и расширил уже существующую модель User с помощью моей собственной модели UserProfile с помощьюдополнительные поля.Недавно я решил добавить дополнительное поле в модель UserProfile (profile_type).Я добавил его в модель и включил в соответствующую форму, а также запустил изменения и миграции.Затем я попытался вставить начальное значение в это поле в своих представлениях и обнаружил, что оно не отображается в форме через print (), однако все остальные поля имеют вид.

Моя модель UserProfile

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete = models.CASCADE, related_name='userprofile')
    gender = models.CharField(max_length = 10)
    city = models.CharField(max_length = 45)
    country = models.CharField(max_length = 45)
    birthdate = models.DateField(null=True)
    phone_number = models.CharField(max_length = 15)
    profile_type = models.CharField(max_length = 6)


@receiver(post_save, sender=User)
def save_profile(sender, instance, created, **kwargs):
    if created:
        profile = UserProfile(user=instance)
        profile.save()

Мои формы UserProfile (UserProfileForm содержит поля, необходимые для регистрации, AdditionalUserProfileForm - остальные)

class UserProfileForm(UserCreationForm):

    class Meta:
        model = User    
        fields = ('first_name', 'last_name', 'email', 'username', 'password1', 'password2')

    def save(self, commit=True):
        user = super(UserProfileForm, self).save(commit=True)
        user.email = self.cleaned_data['email']
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.save()
        return user

class AdditionalUserProfileForm(forms.ModelForm):
    profile_type = forms.CharField(max_length=6)

    class Meta:
        model = UserProfile
        fields = ('gender', 'city', 'country', 'birthdate', 'phone_number', 'profile_type')

Мой вид регистрации (я хочу добавить значение для profile_type вручную при создании экземпляра

@transaction.atomic
def signup_view(request):
    if request.method == 'POST':
        user_profile_form = UserProfileForm(request.POST)
        initial = {
            'profile_type': 'user'
        }
        additional_user_profile_form = AdditionalUserProfileForm(request.POST, initial=initial)
        valid = user_profile_form.is_valid() * additional_user_profile_form.is_valid()
        if valid:
            user = user_profile_form.save()
            for field in ['gender', 'city', 'country', 'birthdate', 'phone_number']:
                setattr(user.userprofile, field,
                        additional_user_profile_form.cleaned_data.get(field))
            user.userprofile.save()
        return redirect('login')
    else:
        user_profile_form = UserProfileForm()
        additional_user_profile_form = AdditionalUserProfileForm()
        context = {
            'user_profile_form': user_profile_form,
            'additional_user_profile_form': additional_user_profile_form,
        }
        return render(request, 'registration/signup.html', context)

Распечатка полей формы в терминале не показывает, что profile_type является одним из них. Я видел в каком-то потоке, что это ошибка, но исправление не сработало для меня. Это было что-то об изменениифункция get_fieldsets в contrib / admin / options.py. Надеюсь, это подсказка. Спасибо!

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