Django 2.1 Создать профиль при создании пользователя - PullRequest
0 голосов
/ 28 января 2019

Я работаю над проектом с использованием Python (3.7) и Django (2.1), в котором мне нужно создать профиль пользователя при создании пользователя.

Вот что я попробовал:

С models.py:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    avatar = models.CharField(max_length=500, null=True)
    about = models.CharField(max_length=1000, null=True)
    slogan = models.CharField(max_length=500, null=True)
    profile_pic = models.FileField(upload_to='media/profile_pics', null=True)

    def __str__(self):
        return self.user.username

С signals.py:

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


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

С urls.py:

path('register/', views.RegisterUser.as_view(), name='register'),

С views.py:

def post(self, request, *args, **kwargs):
    if request.method == 'POST':
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data.get('username')
            messages.success(request, f'Account has been created for {username}!')
            form.save()
            return HttpResponseRedirect(reverse_lazy('login'))

        else:
            form = UserRegisterForm()
        return render(request, 'users/register.html', {'form': form})

С forms.py:

class UserRegisterForm(UserCreationForm):
    email = forms.EmailField()

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

С apps.py:

class JobexpertappConfig(AppConfig):
    name = 'jobexpertapp'
    app_label = 'jobexpertapp'

    def ready(self):
        import jobexpertapp.signals

Обновление: Я также использую аутентификацию facebook на своем сайте, используя django-social-auth и для полученияаватар на фейсбуке, я реализовал 2 вещи, (а) определил social_auth_pipeline.py (б): добавить SOCIAL_AUTH_PIPELINE в settings.py:

Итак,

С social_auth_pipeline.py:

def save_avatar(backend, user, response, *args, **kwargs):
    try:
        profile = Profile.objects.get(user_id=user.id)
    except Profile.DoesNotExist:
        profile = Profile(user_id=user.id)

    if backend.name == 'facebook':
        profile.avatar = 'http://graph.facebook.com/{}/picture?type=large'.format(response['id'])

    profile.save()

С settings.py:

SOCIAL_AUTH_PIPELINE = (

    'social.pipeline.social_auth.social_details',
    'social.pipeline.social_auth.social_uid',
    'social.pipeline.social_auth.auth_allowed',
    'social.pipeline.social_auth.social_user',
    'social.pipeline.user.get_username',
    'social.pipeline.user.create_user',
    'social.pipeline.social_auth.associate_user',
    'social.pipeline.social_auth.load_extra_data',
    'social.pipeline.user.user_details',
    # 'apps.users.pipeline.get_avatar',
    'jobexpertapp.social_auth_pipeline.save_avatar',
)

Когда я создаю новую учетную запись через страницу регистрации, она создаетuser но не профиль.Также не удалось найти ошибку на консоли при создании пользователя.Что тут может быть не так?

Заранее спасибо!

1 Ответ

0 голосов
/ 17 мая 2019

У меня возникла такая же проблема.

Мои сигналы были в моих 'users' / 'apps.py' в классе UsersConfig (AppConfig):

def ready(self):
    import users.signals

Для меня работало следующее.В проекте / 'settings.py' в списке INSTALLED_APPS я использовал список своих приложений с их именами (например, «блоги», «пользователи»).Когда я изменил это и перечислил их так: вместо этого: 'blog.apps.BlogConfig', 'users.apps.UsersConfig', соответственно сработало создание / сохранение профиля при создании / сохранении пользователя.

...