Как создать автоматический профиль пользователя в django
Как создать автоматический профиль пользователя? Есть ли способ создать автоматический профиль пользователя, когда пользователь заполнил регистрационную форму в django, например, в Stack Overflow. В Stack Overflow, когда новый пользователь создал аккаунт на Gmail, Facebook или Github, Stack Overflow создаст для него автоматический профиль пользователя, чтобы он мог редактировать его по своему усмотрению. Я знаю, как реализовать функцию редактирования с помощью UpdateView. Я просто хочу создать автоматический профиль пользователя, когда форма отправлена. могу ли я создать автоматический профиль пользователя в django, если да, то как?
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
profile_image = models.ImageField(upload_to='avatar', blank=True, null=True)
stories = RichTextField(blank=True, null=True)
twitter = models.URLField(max_length=300, blank=True, null=True)
website = models.URLField(max_length=300,blank=True, null=True)
city = models.CharField(max_length=50, blank=True, null=True)
location = models.CharField(max_length=80, blank=True, null=True)
slug = models.SlugField(unique=True, max_length=200)
def save(self, *args, **kwargs):
self.slug = slugify(self.user)
super(Profile, self).save(*args, **kwargs)
def __str__(self):
return str(self.user)
просмотров моей регистрации пользователя:
def register(request):
if request.method == 'POST':
username = request.POST['username']
first_name = request.POST['first_name']
last_name = request.POST['last_name']
email = request.POST['email']
password = request.POST['password']
password2 = request.POST['password2']
if password == password2:
if User.objects.filter(email=email).exists():
messages.info(request, 'Email or user name Already taking')
return redirect('register')
elif User.objects.filter(username=username).exists():
messages.info(request, 'username is taken')
return redirect('register')
else:
user = User.objects.create_user(username=username, first_name=first_name,
last_name=last_name, email=email, password=password)
user.save();
return redirect('Home')
else:
messages.info(request, 'Password Not Match')
return redirect('register')
return redirect ('/')
else:
return render(request, 'signup.html')
Вам необходимо использовать Django Signals.
создайте файл signals.py
from django.conf import settings
from django.db.models.signals import post_save
from django.dispatch import receiver
from . models import Profile
User = settings.AUTH_USER_MODEL
#this function wake up after a User object save
@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
Итак, существует файл python signals.py, который будет обрабатывать все подобные вещи в фоновом режиме, вы должны узнать об этом файле, вместо того, чтобы пропустить эту часть, потому что она необходима, перейдите к документам django и узнайте больше об этом... https://docs.djangoproject.com/en/4.0/topics/signals/
@enes islam отвечает на ваш вопрос, если я буду делать это снова, поэтому мой комментарий будет бесполезен, поэтому у меня есть еще один маленький совет для вас, если вы не хотите создавать файл сигналов или импортировать в apps.py методом get ready, если вы хотите пропустить это, поэтому вы просто добавляете код сигналов в свои модели, поэтому вы не хотите импортировать в сигналы Я думаю, что этот комментарий будет полезен для всех, кто придет сюда через месяц или год....
в первый раз я принимаю ответ @enes islam, но он не работает, пока я не добавлю это в свой файл apps.py:
файл apps.py:
def ready(self):
from . import signals
@enes islam ответ
Вам необходимо использовать Django Signals
создайте файл signals.py
from django.conf import settings
from django.db.models.signals import post_save
from django.dispatch import receiver
from . models import Profile
User = settings.AUTH_USER_MODEL
#this function wake up after a User object save
@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
В основном я не прочитал ваш вопрос с концентрацией и я думал, что вы хотите создать автоматический профиль пользователя с картинкой по умолчанию и полями по умолчанию извините за это Поэтому я отвечу на ваш вопрос правильно Вы говорите о системе социальной авторизации с помощью django Хорошо, первым делом вам нужно установить сторонний пакет
$ pip install django-allauth
затем добавьте это в каталог установленных приложений вашего проекта
INSTALLED_APPS = [
...
# 3rd party
"allauth",
"allauth.account",
"allauth.socialaccount",
# social providers
"allauth.socialaccount.providers.github",
"allauth.socialaccount.providers.twitter",
...
]
затем перейдите в каталог вашего проекта и добавьте это в файл settings.py
AUTHENTICATION_BACKENDS = (
"allauth.account.auth_backends.AuthenticationBackend",
)
SITE_ID = 1
ACCOUNT_EMAIL_VERIFICATION = "none"
LOGIN_REDIRECT_URL = "home"
ACCOUNT_LOGOUT_ON_GET = True
Затем добавьте эту кнопку на страницу регистрации
<a href="{% provider_login_url 'twitter' %}" class="Your_custom_classes">
<span>Login with Twitter</span>
</a>
Примечание: после завершения этого процесса, когда вы столкнетесь с проблемой, как no null contrained_id... просто удалите вашу базу данных dbsqlite, затем создайте другого суперпользователя, после этого вы не столкнетесь ни с какой проблемой
Надеюсь, это поможет вам