#python #django
#python #django
Вопрос:
Я использую django-allauth для регистрации пользователя и входа в систему, но у меня есть еще один шаг под названием «нажмите, чтобы завершить», это должно появиться для завершения их профиля при регистрации пользователя. Но я получаю следующую ошибку. прежде всего, здесь я уже пробовал
model.py
class CustomUser(AbstractUser):
def __str__(self):
return self.email
class Profile(models.Model):
user = models.OneToOneField('users.CustomUser', on_delete=models.CASCADE)
def __str__(self):
return self.user.email
forms.py
class CustomUserCreationForm(UserCreationForm):
class Meta(UserCreationForm):
model = CustomUser
fields = ('username', 'email')
class CustomUserChangeForm(UserChangeForm):
class Meta:
model = CustomUser
fields = ('username', 'email')
class ProfileForm(forms.ModelForm):
company_name = forms.CharField(max_length=100)
phone_number = forms.CharField(max_length=20)
city = forms.CharField(max_length=15)
address = forms.CharField(max_length=255)
class Meta:
model = Profile
fields = ['company_name', 'phone_number', 'city', 'address']
views.py
def profile(request):
if request.method == 'POST':
form = ProfileForm(request.POST)
if form.is_valid():
form.save()
redirect('dashboard')
else:
form = ProfileForm()
return render(request, 'users/profile.html', {'form':form})
Я получаю эту ошибку
Traceback (most recent call last):
File "C:UsersZako5.virtualenvsinventory_project-V0PloAkRlibsite-packagesdjangocorehandlersexception.py", line 34, in inner
response = get_response(request)
File "C:UsersZako5.virtualenvsinventory_project-V0PloAkRlibsite-packagesdjangocorehandlersbase.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "C:UsersZako5.virtualenvsinventory_project-V0PloAkRlibsite-packagesdjangocorehandlersbase.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:UsersZako5inventory_projectusersviews.py", line 13, in profile
form.save()
File "C:UsersZako5.virtualenvsinventory_project-V0PloAkRlibsite-packagesdjangoformsmodels.py", line 458, in save
self.instance.save()
File "C:UsersZako5.virtualenvsinventory_project-V0PloAkRlibsite-packagesdjangodbbackendsutils.py", line 99, in execute
return super().execute(sql, params)
File "C:UsersZako5.virtualenvsinventory_project-V0PloAkRlibsite-packagesdjangodbbackendsutils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "C:UsersZako5.virtualenvsinventory_project-V0PloAkRlibsite-packagesdjangodbbackendssqlite3base.py", line 383, in execute
return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: NOT NULL constraint failed: users_profile.user_id
[06/Apr/2019 11:50:13] "POST /account/profile HTTP/1.1" 500 150456
Я искал некоторые ответы, но ни один из них не сработал в моем случае.
Будем признательны за любую помощь!
Комментарии:
1. Если вы уже используете абстрактного пользователя, почему вы используете профиль в отношениях «Один к одному»? И, возвращаясь к вашей ошибке, вы не указываете, какой профиль пользователя в вашем
profile
представлении. В вашей модели профиля у вас есть пользователь, имя_компании, номеро_фона, город, адрес. Но вы сохраняете только для последних четырех.
Ответ №1:
Вам нужно добавить значение user
поля в объект Profile.
Для этого перед сохранением профиля вы можете прикрепить пользователя из request.user
. Использование form.save(commit=False)
вернет экземпляр профиля, который не был сохранен в базе данных, затем добавьте пользователя в этот экземпляр профиля.
Например:
from django.contrib.auth.decorators import login_required
@login_required
def profile(request):
if request.method == 'POST':
form = ProfileForm(request.POST)
if form.is_valid():
profile = form.save(commit=False)
profile.user = request.user
profile.save()
return redirect('dashboard')
else:
form = ProfileForm()
return render(request, 'users/profile.html', {'form':form})
Комментарии:
1. большое спасибо, это работает очень хорошо. Не могли бы вы сказать мне, пожалуйста, одну вещь? Когда пользователь регистрируется, он должен автоматически перенаправляться на форму профиля для заполнения, но он перенаправляет на панель мониторинга, форма профиля отсутствует. как я могу это сделать?
2. Я думаю, что лучше использовать сигналы для создания профилей. Профиль будет автоматически создан, когда пользователь создается с помощью сигналов. В этом руководстве вы найдете хороший пример: simpleisbetterthancomplex.com/tutorial/2016/07/28 /…