Расширение django UserCreationForm - PullRequest
       46

Расширение django UserCreationForm

0 голосов
/ 25 апреля 2018

Ну, я продлил пользователя:

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    sheba = models.DecimalField(max_digits= SHEBA_LENGTH, decimal_places = 0)
    mellicode = models.DecimalField(max_digits=11, decimal_places = 0)

Но проблема в том, что у нас есть UserCreationForm для регистрации пользователя. Теперь мне нужна новая форма для обработки добавленных полей. Мне нравится создавать форму из модели, используя ModelForm. Теперь проблема в том, что UserCreationForm сам использует ModelForm для создания полей для User модели. ModelForm имеет внутренний класс с именем Meta, в котором есть поле с именем model для указания, какую модель следует прочитать для требуемого поля. Я думал, что должен быть способ сделать это, поскольку это обычная вещь.

То, что у меня сейчас не работает по понятным причинам, таково:

class SignUpForm(UserCreationForm, ModelForm):
    class Meta(UserCreationForm.Meta):
        model = UserProfile
        fields = ['user','mellicode', 
        'birthdate','residentialaddress','postalcode','sheba','idpic'] 

1 Ответ

0 голосов
/ 25 апреля 2018

Основываясь на статье этого умного парня , вы можете настроить новую модель UserProfile так, чтобы она автоматически создавала / обновляла всякий раз, когда новый экземпляр пользователя создавался или обновлялся существующий, используя следующее расширение вашей модели:

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    sheba = models.DecimalField(max_digits= SHEBA_LENGTH, decimal_places = 0)
    mellicode = models.DecimalField(max_digits=11, decimal_places = 0)

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

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

Поскольку Django позволяет вам обрабатывать две формы одновременно, вы можете решить вашу проблему, используя следующий подход:

class UserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ('first_name', 'last_name', 'email')

class UserProfileForm(forms.ModelForm):
    class Meta:
        model = UserProfile
        fields = ('sheba', 'mellicode')

А потом в твоих views.py:

@login_required
@transaction.atomic
def create_user_profile(request):
    if request.method == 'POST':
         user_form = UserForm(request.POST, instance=request.user)
         user_profile_form = UserProfileForm(request.POST, instance=request.user.profile)
         if user_form.is_valid() and user_profile_form.is_valid():
             user_form.save()
             user_profile_form.save()
             messages.success(request, "User successfully created")
         else:
             messages.error(request, "Correct errors")
    else:
        user_form = UserForm(instance=request.user)
        user_profile_form = UserProfileForm(instance=request.user.user_profile)
    return render(request, 'create_profile.html', {
        'user_form': user_form,
        'user_profile_form': user_profile_form
    })

И в вашем шаблоне вы будете рендерить две формы:

<form method="post">
  {% csrf_token %}
  {{ user_form.as_p }}
  {{ profile_form.as_p }}
  <button type="submit">Save changes</button>
</form>
...