(snip 'programming by accident' code)

I'm not sure you really understand what you're doing :-/


> > > Here's my problem, I know you don't get direct access to the user
> > > model,
>
> > Yes you do.
>
> > > so making the user email editable is kind of tricky
>
> > Why so ?
>
> you can't query for a user with request.user

Query what ?

> but I can with user_id as
> above.

Where exactly ?

> > I personnaly don't use a ModelForm for user profiles - since you
> > (usually) have to mix&match data from both the user and profile
> > models, I find it simpler to use a plain forms.Form and handle the
> > fields/models mapping, saving etc by myself
>
> Do you have an example, I keep piecing together stuff from the b-list
> etc.

Yeps, that's what your code looks like - copy/paste without true
undrestanding...

Here's a (shortened and simplified) snippet:

class ProfileForm(forms.Form):
    # User fields
    first_name = forms.CharField(
        label=_("First name"),
        max_length=30
        )

    last_name = forms.CharField(
        label=_("Last name"),
        max_length=30
        )

    email = forms.EmailField(
        label=_("E-mail"),
        max_length=128,
        help_text=_(u"ex : pre...@exemple.com")
        )

    _USER_FIELDS = (
        'first_name',
        'last_name',
        'email'
        )

    # Profile fields
    address1 = forms.CharField(
        label=_("Address 1"),
        max_length=80
        )

    address2 = forms.CharField(
        label=_("Address 2"),
        max_length=80,
        required=False
        )

    postcode = forms.CharField(
        label=_("Postcode"),
        max_length=10, # should be enough for most cases ? NB : max 8
in current dataset
        required=False    # no postcode for IR ???
        )

    town = forms.CharField(
        label=_("Town"),
        max_length=100
        )


    #
--------------------------------------------------------------------------
    def _from_model(self, name):
        if name in self._USER_FIELDS:
            return getattr(self.user, name)
        else:
            return getattr(self.profile, name)

    #
--------------------------------------------------------------------------
    def _to_model(self, name, value):
        if name in self._USER_FIELDS:
            setattr(self.user, name, value)
        else:
            setattr(self.profile, name, value)

    #
--------------------------------------------------------------------------
    def __init__(self, profile, *args, **kw):
        self.prefix = kw.get("prefix", None)
        data = kw.pop('data', {}).copy()

        self.profile = profile
        self.user = user = profile.user

        for name in self.base_fields:
            data.setdefault(self.add_prefix(name),
self._from_model(name))

        kw['data'] = data
        super(ProfileForm, self).__init__(*args, **kw)


    #
--------------------------------------------------------------------------
    def save(self):
        if not self.is_valid():
            raise ValueError("trying to save an invalid form")

        # XXX : handle transaction here ?
        self.user.save()
        self.profile.save()

        return self.profile, self.user

#
------------------------------------------------------------------------------
#
------------------------------------------------------------------------------
@login_required
@csrf_protect
def profile_edit(request, *args, **kw):
    user = request.user
    profile = user.get_profile()

    if request.method == "POST":
        profile_form = ProfileForm(profile, data=request.POST)
        if profile_form.is_valid():
            profile_form.save()
            user.message_set.create(message=_("Your profile has been
modified successfully"))
            return HttpResponseRedirect(reverse("core_profile_edit"))
    else:
        profile_form = ProfileForm(profile)

    context = dict(
        profile=profile,
        profile_form=profile_form,
        )

    return render_to_response(
        "core/profile_edit.html",
        context,
        context_instance=RequestContext(request)
        )


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

Reply via email to