Estoy tratando de completar un campo de perfil de usuario en el registro de usuario (he leído que esto no se recomienda, sin embargo, es obligatorio para mi aplicación)

modelo.py

class UserProfile(models.Model):
user = models.OneToOneField(User,on_delete=models.CASCADE)

twitter = models.CharField(max_length=50)

def create(sender, **kwargs):
    if kwargs['created']:
        user_profile = UserProfile.objects.create(user=kwargs['instance'])

post_save.connect(create, sender=User)

ver.py

def register(request):
if request.method == 'POST':
    form = RegForm(request.POST)
    if form.is_valid():
        form.save()
        return redirect('/home')
else:
    form = RegForm()

    args = {'form': form}
    return render(request, 'home/registration_form.html', args)

formulario.py

class RegForm(UserCreationForm):
    email = forms.EmailField(required=True)
    username = forms.CharField(max_length=50, required=True)
    twitter = forms.CharField(max_length=50, required=True)

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

    def save(self, commit=True):
        user = super(RegForm, self).save(commit=False)
        user.username = self.cleaned_data['username']
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']

        user.email = self.cleaned_data['email']
        user.userprofile.twitter = self.cleaned_data['twitter']

       if commit:
           user.save()

       return user

Actualmente, recibo el error "El usuario no tiene perfil de usuario"

(La primera vez que uso Django, lo siento si esta es una pregunta tonta, no pude encontrar nada que me ayudara en línea)

Rastrear:

Archivo "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/utils.py" en _execute 85. return self.cursor.execute(sql, params)

Archivo "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py" en ejecutar 298. return Database.Cursor.execute(self, consulta, parámetros)

La excepción anterior (la restricción NOT NULL falló: app_userprofile.user_id) fue la causa directa de la siguiente excepción:

Archivo "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/core/handlers/exception.py" en el interior 34. respuesta = get_response (solicitud)

Archivo "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/core/handlers/base.py" en _get_response 126. respuesta = self.process_exception_by_middleware(e, request)

Archivo "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/core/handlers/base.py" en _get_response 124. respuesta = wrap_callback(solicitud, *callback_args, ** callback_kwargs)

Archivo "/Users/IS/Desktop/Project/website/app/views.py" en el registro 37. form.save()

Archivo "/Users/IS/Desktop/Project/website/app/form.py" en save 42. profile.save()

Archivo "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/base.py" en save 718. force_update=force_update, update_fields=update_fields)

Archivo "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/base.py" en save_base 748. actualizado = self._save_table(raw, cls, force_insert , force_update, usando, update_fields)

Archivo "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/base.py" en _save_table 831. resultado = self._do_insert(cls._base_manager, usando , campos, update_pk, raw)

Archivo "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/base.py" en _do_insert 869. using=using, raw=raw)

Archivo "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/manager.py" en manager_method 82. return getattr(self.get_queryset(), nombre) (*args, **kwargs)

Archivo "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/query.py" en _insertar 1136. devolver consulta.get_compiler(using=using).execute_sql (return_id)

Archivo "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/sql/compiler.py" en execute_sql 1289. cursor.execute(sql, params)

Archivo "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/utils.py" en ejecutar 100. return super().execute(sql, params)

Archivo "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/utils.py" en ejecutar 68. return self._execute_with_wrappers(sql, params, many= Falso, ejecutor=self._execute)

Archivo "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/utils.py" en _execute_with_wrappers 77. return executor(sql, params, many, context)

Archivo "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/utils.py" en _execute 85. return self.cursor.execute(sql, params)

Archivo "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/utils.py" en la salida 89. aumente dj_exc_value.with_traceback(traceback) desde exc_value

Archivo "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/utils.py" en _execute 85. return self.cursor.execute(sql, params)

Archivo "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py" en ejecutar 298. return Database.Cursor.execute(self, consulta, parámetros)

Tipo de excepción: IntegrityError en /app/register/ Valor de excepción: NOT NULL restricción fallida: app_userprofile.user_id

respuesta

No estoy seguro de dónde leíste que no deberías hacer esto; está bien.

Dado que está creando el usuario, también debe crear el perfil de usuario.

user = super(RegForm, self).save(commit=False)
profile = UserProfile(user=user, twitter=form.cleaned_data["twitter"]
if commit:
    user.save()
    profile.save()

Pero ahora que ha hecho esto, debe eliminar esa señal. No lo necesitas.

Tenga en cuenta que no necesita configurar el nombre de usuario, el nombre o el apellido, el formulario lo hará por usted.