Сбой ограничения NOT NULL: users_profile.user_id

#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 /…