Je crée un formulaire où les utilisateurs peuvent enregistrer des utilisateurs supplémentaires, et je dois passer automatiquement la clé étrangère (organisation) de l'utilisateur actuel au nouvel utilisateur en cours de création.
Je suis relativement nouveau sur Django, mais je pense que le problème vient de la ligne suivante dans les formulaires:
"user.organization = self.instance.organization"
Model
class UserOrgCreationForm(UserCreationForm):
password1 = None
password2 = None
class Meta:
model = User
fields = ('email', 'first_name', 'last_name', 'user_type')
def save(self, commit=True):
user = super(UserCreationForm, self).save(commit=False)
user.set_unusable_password()
user.organization = self.instance.organization
if commit:
user.save()
return user
3 Réponses :
Vous pouvez utiliser commit = False paramètre . Cela n'enregistrera pas le formulaire dans la base de données tant que .save () ne sera pas appelé une deuxième fois.
def register(request):
if request.method == 'POST':
form = UserOrgCreationForm(request.POST)
if form.is_valid():
obj = form.save(commit=False)
obj.organization = request.user.organization
obj.save()
email = form.cleaned_data.get('email')
messages.success(request, f'User has been created')
# return redirect('login')
else:
form = UserOrgCreationForm()
return render(request, 'users/register.html', {'form': form})
Étant donné que votre formulaire n'est pas basé sur une instance existante (non transmis lors de la création de l'instance de formulaire), vous ne pouvez pas y faire référence lors de l'enregistrement.
Vous pouvez faire ce que vous voulez dans la vue comme ci-dessous
def register(request):
if request.method == 'POST':
form = UserOrgCreationForm(request.POST)
if form.is_valid():
new_user = form.save(commit=False)
new_user.organization = request.user.organization
new_user.save()
email = form.cleaned_data.get('email')
messages.success(request, f'User has been created')
# return redirect('login')
else:
form = UserOrgCreationForm()
return render(request, 'users/register.html', {'form': form})
Assurez-vous d'encapsuler la vue avec le décorateur login_required pour vous assurer que request.user est un utilisateur connecté.
Vous devez accéder au request.user.organisation depuis le formulaire save.
def register(request):
form = UserOrgCreationForm(request.POST or None, current_user=request.user)
if form.is_valid():
form.save()
email = form.cleaned_data.get('email')
messages.success(request, f'User has been created')
# return redirect('login')
return render(request, 'users/register.html', {'form': form})
Et depuis la vue:
class UserOrgCreationForm(UserCreationForm):
password1 = None
password2 = None
class Meta:
model = User
fields = ('email', 'first_name', 'last_name', 'user_type')
def save(self, commit=True):
user = super(UserCreationForm, self).save(commit=False)
user.set_unusable_password()
user.organization = current_user.organization
if commit:
user.save()
return user
def __init__(self,*args,**kwargs):
self.current_user = kwargs.pop("current_user", None)
super(UserOrgCreationForm,self).__init__(*args,**kwargs)