On Mon, Apr 21, 2008 at 12:06 PM, Rishabh Manocha <[EMAIL PROTECTED]>
wrote:

>
> Thanks for writing back, Karen. I guess the snippets of code I
> inserted were a little misleading. I have many other modelforms too,
> which all have a user = ForeignKey(User) defined. Problem is that I
> have to use multiple instances of these forms (for example, I need I
> have a ModelForm called PrevoiusOrganisation. Each instance represents
> one org, but I want the user to be able to enter multiple previous
> organisations ) which all have to have their "user" set. An example
> is:
>
> if request.POST:
>    new_user = UserDetailsForm(request.POST, request.FILES,
> instance=User())
>    prevorgforms = [PrevOrgsForm(request.POST,
> prefix="prevorgs"+str(x), instance = PrevOrgs()) for x in range(0, 3)]
>    prevorgprojsforms = [PrevOrgProjsForm(request.POST,
> prefix="prevorgprojs"+str(x), instance = PrevOrgProjs()) for x in
> range(0, 4)]
>    if new_user.is_valid() and all([prevorgform.is_valid() for
> prevorgform in prevorgforms]) and ...:
>        new_user_id = new_user.save()
>        set_user_id(prevorgforms,new_user_id)
>        set_user_id(prevorgprojsforms,new_user_id)
>        ...
>
> def set_user_id(the_list, the_user_id):
>    for list_elem in the_list:
>        new_list_elem = list_elem.save(commit=False)
>        new_list_elem.user = the_user_id
>        new_list_elem.save()
>
> I have not had any issues with this function and my other modelforms,
> so I don't think I'm doing something wrong here. I suspect something
> is missing either during the Ajax call or later when I set the
> queryset for each list on submission.
>
> Hope that clears up my problem a little bit more.
>

Well no, that didn't really clear things up.  You were asking about trouble
saving a SkillListForm and now are posting about how set_user_id is called
when you are doing things with a UserDetailsForm and some different
organization forms with multiple instances, which is confusing since it
seems entirely unrelated to the original problem.  I gather what you are
trying to say, though, is that this same set_user_id function is called when
you are doing the processing to save a SkillListForm?  If so I'm not sure
why you didn't just post the code involved when saving a SkillListForm.

Anyway, on closer inspection of the SkillListForm I do notice a problem: you
override skill like so:

skill = forms.ModelMultipleChoiceField(required = True, label = "Technical
Skill",queryset = A.objects.none())

This should be a ModelChoiceField, not a ModelMultipleChoiceField.  (Also
the queryset should be tied to the B model, not A, since skill is a
ForeignKey specifying a B model instance.)

However, though this error would produce exactly the symptom you describe,
I'm not entirely sure that is the cause of your problem because you say your
form displays two drop-down boxes and a ModelMultipleChoiceField wouldn't
have a drop-down widget, so I am not sure the code you posted really matches
what you are running (there are also some typos in the ForeignKey
definitions, so it seems you re-typed vs. cut-and-pasted your code).  People
are much more likely to be able to provide useful help when you post exactly
the code you are running.  If you feel it is too complicated by all means
try to simplify it, but verify you still hit the problem with the simplified
code.  Oftentimes in the process of simplifying you can identify what is
causing the problem.

Karen


> Best,
>
> R
>
>
> On Mon, Apr 21, 2008 at 6:38 PM, Karen Tracey <[EMAIL PROTECTED]> wrote:
> >
> > On Mon, Apr 21, 2008 at 2:53 AM, Rishabh Manocha <[EMAIL PROTECTED]>
> wrote:
> >
> >
> > >
> > > Hey Guys,
> > >
> > > I have 4 models working something like this:
> > >
> > > class User(models.Model):
> > >   name = models.CharField()
> > >   email = models.EmailField()
> > >   ...
> > >
> > > class A(models.Model):
> > >   domainname = models.CharField()
> > >
> > > class B(models.Model):
> > >   domain = models.ForigenKey(A)
> > >   name = models.CharField()
> > >
> > > class C(models.Model):
> > >   user = models.ForiegnKey(User)
> > >   skill = models.ForeignKey(B)
> > >   years = models.IntegerField()
> > >
> > > The reason class C exists is because A & B will be used as drop down
> > > lists whose values only the admin should enter through the admin
> > > interface. That bit is working ok.
> > >
> > > I use ModelForms to load the form for C (like this):
> > >
> > > class SkillListForm(forms.ModelForm):
> > >    domainname = forms.ModelChoiceField(required=True, label =
> > > "Domain", widget = forms.Select({"onchange" : "javascript:
> > > updateTechSkillsList(this);"}),queryset = A.objects.all())
> > >    skill = forms.ModelMultipleChoiceField(required = True, label =
> > > "Technical Skill",queryset = A.objects.none())
> > >
> > >    class Meta:
> > >         model = C
> > >         exclude = ("user",)
> > >
> > > The form, as you can see, produces two drop down lists. The second one
> > > is blank to begin with, but the javascript function
> > > (updateTechSkillsList) populates it based on the selection in the
> > > first list. The JS function makes an Ajax call to a URL whose function
> > > in views.py is:
> > >
> > > def populate_techskills(request):
> > >    if request.GET:
> > >        domain = get_object_or_404(A, pk=request.GET['domain_id'])
> > >        choices = domain.b_set.all()
> > >        choices_html = ""
> > >        for choice in choices:
> > >            choices_html += "<option value=\"%s\">%s</option>" %
> > > (choice.id, choice.name)
> > >        return HttpResponse(choices_html)
> > >    else:
> > >        return HttpResponseRedirect("/userform/")
> > >
> > > When the form is finally submitted, I reset the queryset for skills
> > > after checking for request.POST so that the values populated by JS and
> > > the values being held by the form instance are the same:
> > > myform.fields['skill'].queryset = A.objects.get(pk =
> > > request.POST["techskills-domainname"]).b_set.all()
> > >
> > > The form then validates ok (passes myform.is_valid()) however, when it
> > > comes time to save it, I keep getting the following error:
> > >
> > > Traceback:
> > > File "C:\Python25\Lib\site-packages\django\core\handlers\base.py" in
> > > get_response
> > >  82.                 response = callback(request, *callback_args,
> > > **callback_kwargs)
> > > File "C:\Documents and
> > >
> >
> Settings\rmanocha\workspace\TechSkillsInventory\..\TechSkillsInventory\users\views.py"
> > > in index
> > >  57.           set_user_id(techskillslistforms, new_user_id)
> > > File "C:\Documents and
> > >
> >
> Settings\rmanocha\workspace\TechSkillsInventory\..\TechSkillsInventory\users\views.py"
> > > in set_user_id
> > >  12.         new_list_elem.save()
> > > File "C:\Python25\Lib\site-packages\django\db\models\base.py" in save
> > >  264.                     ','.join(placeholders)), db_values)
> > > File "C:\Python25\Lib\site-packages\django\db\backends\util.py" in
> execute
> > >  18.             return self.cursor.execute(sql, params)
> > > File "C:\Python25\Lib\site-packages\MySQLdb\cursors.py" in execute
> > >  166.             self.errorhandler(self, exc, value)
> > > File "C:\Python25\Lib\site-packages\MySQLdb\connections.py" in
> > > defaulterrorhandler
> > >  35.     raise errorclass, errorvalue
> > >
> > > Exception Type: OperationalError at /userform/
> > > Exception Value: (1048, "Column 'skill_id' cannot be null")
> > >
> > >
> > > The POST variable has a value for skill, and printing out
> > > form.cleaned_data['skill'] inside SkillListForm.clean_skill prints the
> > > correct id. However, I am still getting this error. Can anyone see
> > > what I'm doing wrong here??
> > >
> >
> > From the traceback I don't see any evidence that the problem is
> occurring
> > when you try to save the form you have posted details on.  Rather your
> > views.py index function is calling a function named set_user_id, which
> is
> > calling save on something named 'new_list_elem'.  None of that sounds
> like
> > processing for a posted form, so I'm suspecting the problem is coming
> from
> > some other code you haven't mentioned and aren't looking at because you
> are
> > focused on the form-processing code.  It sounds more like perhaps the
> form
> > save is working and redirects to 'index' but then the code that handles
> > index is running into trouble?
> >
> > As an aside, are you really using you own model named User?  This just
> seems
> > like it could lead to confusion with the Django-provided User model in
> > contrib.auth.models.
> >
> > Karen
> >
> >
> >  >
> >
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-users@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to