vendredi 14 novembre 2014

Django forme ChoiceField validation de formulaire cause échec - Stack Overflow


I have the follwing:


desig = []
class New_user_form(UserCreationForm):
desig = forms.ChoiceField(choices=desig)
def acquire_groups(self):
g = Group.objects.all()
for k in g:
desig.append((k.name, k.name))
print(desig)

def save(self, commit=True):
user = super(UserCreationForm, self).save(commit=False)
user.set_password(self.cleaned_data["password1"])
designation = self.cleaned_data["desig"]
print("New_user_form save : Designation :", designation)
if commit:
user.save()
g = Groups.objects.filter(name=designation)
print("acquired group", g[0].name)
user.groups.add(g)
return user

The following is my view:


def register_user(request):
if request.method == 'POST':
form = New_user_form(request.POST)
if form.is_valid():
print("Form Validated")
new_user = form.save()
HttpResponse("Success")
else:
HttpResponse("Invalid Form")
else:
form = New_user_form()
form.acquire_groups()
g = Group.objects.all()
desig = []
for k in g:
desig.append(k.name)
args = {}
args.update({'user':request.user.username,
'form':form,
'STATIC_URL':settings.STATIC_URL,
'desig': desig,})
return render_to_response('register.html', args)

html template


I have tried to save the form many times and it always does not validate. I dont understand why the choice field fails. I am able to use the form without the choice field. But I want to use the choice field to add new users to an existing group. I dont understand why the form is getting invalid.


EDIT: I have changed my form as follows:


class New_user_form(UserCreationForm):
email = forms.EmailField(required=True)
desig = []
def __init__(self, **kwargs):
u = UserCreationForm.__init__(self, kwargs)
try:
if kwargs['desig_group']:
print("desig_group instantiated. Found kwargs = ", kwargs['desig_group'])
else:
print("desig_group not instantiated")
except (AttributeError, KeyError) as ex:
for g in Group.objects.all():
self.desig.append((g.name, g.name))
print("desig : ", self.desig)
desig_group = forms.ModelChoiceField(queryset=Group.objects.all())

def save(self, commit=True):
user = super(UserCreationForm, self).save(commit=False)
user.set_password(self.cleaned_data["password1"])
user.email = self.cleaned_data["email"]
designation = self.cleaned_data["desig_group"]
print("New_user_form save : Designation :", designation)
if commit:
user.save()
g = Groups.objects.filter(name=designation)
print("acquired group", g[0].name)
user.groups.add(g)
return user

I have changed my view now as :


def register_user(request):
if request.method == 'POST':
print("request.POST = ", request.POST)
form = New_user_form(**request.POST)
print("form bound: ", form.is_bound)
print("Form bool: ", bool(form.errors))
if form.is_valid():
print("Form Validated")
new_user = form.save()
return HttpResponse("Added new user")
else:
print("Form is invalid")
HttpResponse("Invalid form submission.")
else:
form = New_user_form()
g = Group.objects.all()
desig = []
for k in g:
desig.append(k.name)
args = {}
args.update(csrf(request))
args.update({'user':request.user.username,
'form':form,
'STATIC_URL':settings.STATIC_URL,
'desig': desig,})
return render_to_response('emp_users/register.html', args)

With this, my form is not passing validation but all the required data is arriving in POST. I just need to know how to validate it now.


form.cleaned_data['desig_group']

returns KeyError but the POST has that value in its querrydictionary


The following is my POST:


request.POST dump




You can't set the choices after the form is initialized. Instead, just set the choices as such:


# forms.py
class New_user_form(UserCreationForm):
desig = forms.ModelChoiceField(queryset=Group.objects.all())
...


# views.py
def register_user(request):
form = New_user_form(request.POST or None)
if request.method == 'POST':
if form.is_valid():
print("Form Validated")
new_user = form.save()

args = {}
args.update({'user':request.user.username,
'form':form, 'STATIC_URL':settings.STATIC_URL,
'desig': desig,})
return render_to_response('register.html', args)


I have the follwing:


desig = []
class New_user_form(UserCreationForm):
desig = forms.ChoiceField(choices=desig)
def acquire_groups(self):
g = Group.objects.all()
for k in g:
desig.append((k.name, k.name))
print(desig)

def save(self, commit=True):
user = super(UserCreationForm, self).save(commit=False)
user.set_password(self.cleaned_data["password1"])
designation = self.cleaned_data["desig"]
print("New_user_form save : Designation :", designation)
if commit:
user.save()
g = Groups.objects.filter(name=designation)
print("acquired group", g[0].name)
user.groups.add(g)
return user

The following is my view:


def register_user(request):
if request.method == 'POST':
form = New_user_form(request.POST)
if form.is_valid():
print("Form Validated")
new_user = form.save()
HttpResponse("Success")
else:
HttpResponse("Invalid Form")
else:
form = New_user_form()
form.acquire_groups()
g = Group.objects.all()
desig = []
for k in g:
desig.append(k.name)
args = {}
args.update({'user':request.user.username,
'form':form,
'STATIC_URL':settings.STATIC_URL,
'desig': desig,})
return render_to_response('register.html', args)

html template


I have tried to save the form many times and it always does not validate. I dont understand why the choice field fails. I am able to use the form without the choice field. But I want to use the choice field to add new users to an existing group. I dont understand why the form is getting invalid.


EDIT: I have changed my form as follows:


class New_user_form(UserCreationForm):
email = forms.EmailField(required=True)
desig = []
def __init__(self, **kwargs):
u = UserCreationForm.__init__(self, kwargs)
try:
if kwargs['desig_group']:
print("desig_group instantiated. Found kwargs = ", kwargs['desig_group'])
else:
print("desig_group not instantiated")
except (AttributeError, KeyError) as ex:
for g in Group.objects.all():
self.desig.append((g.name, g.name))
print("desig : ", self.desig)
desig_group = forms.ModelChoiceField(queryset=Group.objects.all())

def save(self, commit=True):
user = super(UserCreationForm, self).save(commit=False)
user.set_password(self.cleaned_data["password1"])
user.email = self.cleaned_data["email"]
designation = self.cleaned_data["desig_group"]
print("New_user_form save : Designation :", designation)
if commit:
user.save()
g = Groups.objects.filter(name=designation)
print("acquired group", g[0].name)
user.groups.add(g)
return user

I have changed my view now as :


def register_user(request):
if request.method == 'POST':
print("request.POST = ", request.POST)
form = New_user_form(**request.POST)
print("form bound: ", form.is_bound)
print("Form bool: ", bool(form.errors))
if form.is_valid():
print("Form Validated")
new_user = form.save()
return HttpResponse("Added new user")
else:
print("Form is invalid")
HttpResponse("Invalid form submission.")
else:
form = New_user_form()
g = Group.objects.all()
desig = []
for k in g:
desig.append(k.name)
args = {}
args.update(csrf(request))
args.update({'user':request.user.username,
'form':form,
'STATIC_URL':settings.STATIC_URL,
'desig': desig,})
return render_to_response('emp_users/register.html', args)

With this, my form is not passing validation but all the required data is arriving in POST. I just need to know how to validate it now.


form.cleaned_data['desig_group']

returns KeyError but the POST has that value in its querrydictionary


The following is my POST:


request.POST dump



You can't set the choices after the form is initialized. Instead, just set the choices as such:


# forms.py
class New_user_form(UserCreationForm):
desig = forms.ModelChoiceField(queryset=Group.objects.all())
...


# views.py
def register_user(request):
form = New_user_form(request.POST or None)
if request.method == 'POST':
if form.is_valid():
print("Form Validated")
new_user = form.save()

args = {}
args.update({'user':request.user.username,
'form':form, 'STATIC_URL':settings.STATIC_URL,
'desig': desig,})
return render_to_response('register.html', args)

0 commentaires:

Enregistrer un commentaire