Делаем это в виде (без сигнала):
@login_required(login_url='./accounts/login/')
def signup(request):
if request.method == 'POST':
form = SignUpForm(request.POST)
if form.is_valid():
user = form.save()
group = Group.objects.get(name='Clients')
user.groups.add(group)
client = Client.objects.create(
user=user,
address=form.cleaned_data.get('address')
city=form.cleaned_data.get('city')
postal=form.cleaned_data.get('postal')
nif=form.cleaned_data.get('nif')
mobile=form.cleaned_data.get('mobile')
)
return redirect('clients')
else:
form = SignUpForm()
return render(request, 'backend/new_client.html', {'form': form})
Затем вы можете переместить весь код в user = form.save()
в самой форме (я предполагаю, что это пользовательская ModelForm):
# forms.py
class SignUpForm(models.Form):
# your existing code here
def save(self):
# NB if you're still using py2 you'll need
# `user = super(SignUpForm, self).save()` instead
user = super().save()
group = Group.objects.get(name='Clients')
user.groups.add(group)
cleaned_data = self.cleaned_data
client = Client.objects.create(
user=user,
address=cleaned_data.get('address')
city=cleaned_data.get('city')
postal=cleaned_data.get('postal')
nif=cleaned_data.get('nif')
mobile=cleaned_data.get('mobile')
)
return user
И ваше представление становится:
@login_required(login_url='./accounts/login/')
def signup(request):
if request.method == 'POST':
form = SignUpForm(request.POST)
if form.is_valid():
form.save()
return redirect('clients')
else:
form = SignUpForm()
return render(request, 'backend/new_client.html', {'form': form})
Оба варианта верны и функционально эквивалентны, но второй вариант ИМХО более удобен в обслуживании - во-первых, потому что форму легче проверить, чем представление ( вам не нужно создавать объект запроса), а также потому, что он инкапсулирует целые доменные логики c в одном месте (форме) вместо того, чтобы разбрасывать его между формой и представлением. Единственным недостатком является то, что вы теряете возможность передавать commit=False
arg на form.save()
, но, поскольку эта форма, очевидно, не имеет никакой другой цели, вы все равно не будете использовать эту функцию.