views:

380

answers:

1

Hi All,

So im wanting to extend the django auth.User model to add extra fields. Ive read a few articles here and there, and am almost there.

Im just trying to make the signup form at the moment. So a new user can sign up. I can get the new User created but when I come to save the UserProfile object to the database it fails citing

Cannot assign "u'clare'": "Customer.user" must be a "User" instance.

where "clare" is the username ive put in. This user is created in Auth.User, but the UserProfile, in this case called Customer is not created. So I think im doing something wrong when creating the object and using the foreign key to do so. Anyway below are the relevant files.

models.py

from django.db import models
from RadioBusiSite.music.models import PlayList
from django.contrib.auth import authenticate
from django.contrib.auth.models import User
from django import forms

class Location(models.Model):
    Address = models.CharField(max_length=300)
    PhoneNumber = models.CharField(max_length=15)
    Size = models.IntegerField('Size of Premises')

    def __unicode__(self):
        return self.Address

class Customer(models.Model):
    user = models.ForeignKey(User, unique=True)
    Company = models.CharField(max_length=200)
    ContactPerson = models.CharField('Contact Person', max_length=200)
    email = models.CharField(max_length=200)
    ABN = models.CharField(max_length=50)
    Location = models.ForeignKey(Location)
    Playlist = models.ManyToManyField(PlayList)

    def __unicode__(self):
        return self.Company

forms.py

from django.contrib.auth import authenticate
from django.contrib.auth.models import User
from django import forms
from RadioBusiSite.customer.models import Customer
from django.forms.models import modelformset_factory

class CustomerForm(forms.Form):
    user = forms.CharField(max_length=30, label='User Name')
    password1 = forms.CharField(max_length=30, label='Password', widget=forms.PasswordInput(render_value=False))
    password2 = forms.CharField(max_length=30, label=' Check Password', widget=forms.PasswordInput(render_value=False))
    Company = forms.CharField(max_length=200)
    ContactPerson = forms.CharField(max_length=200)
    email = forms.EmailField()
    ABN = forms.CharField(max_length=50)
    #Location = forms.ForeignKey(Location)
    #Playlist = forms.ManyToManyField(PlayList)

    def clean(self):
        if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data:
            if self.cleaned_data['password1'] != self.cleaned_data['password2']:
                raise forms.ValidationError("You must type the same password each time")
        return self.cleaned_data

    def clean_user(self):
        try:
            User.objects.get(username=self.cleaned_data['user'])
        except User.DoesNotExist:
            return self.cleaned_data['user']
        raise forms.ValidationError("This user is already in use. Please Choose another one.")

    def save(self):
        new_user = User.objects.create_user(username = self.cleaned_data['user'],
                                            email = self.cleaned_data['email'],
                                            password = self.cleaned_data['password1'])
        new_customer = Customer.objects.create(user=self.cleaned_data['user'],
                                               company = self.cleaned_data['Company'],
                                               ContactPerson = self.cleaned_data['ContactPerson'],
                                               email = self.cleaned_data['email'],
                                               ABN = self.cleaned_data['ABN'])

views.py

from django.shortcuts import render_to_response
from django.http import HttpResponse, HttpResponseRedirect
from RadioBusiSite.customer.models import Customer,Location
from RadioBusiSite.customer.forms import CustomerForm
from django.contrib.auth import authenticate
from django.contrib.auth.models import User

def addCustomer(request):
    if request.method == 'POST':
        #user = UserForm(request.POST, instance=request.user)
        form = CustomerForm(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/home/')
    else:
        form = CustomerForm()

    return render_to_response('addCustomer.html', {
        'form': form,
    })

And ive enabled the AUTH think like so

AUTH_PROFILE_MODULE = 'customer.Customer'

the file above are all in a folder called "customer"

Any help would be great.

Cheers Mark

+2  A: 
def save(self):
    new_user = User.objects.create_user(username = self.cleaned_data['user'],
                        email = self.cleaned_data['email'],
                        password = self.cleaned_data['password1'])
    new_customer = Customer.objects.create(user=**new_user**,
                           company = self.cleaned_data['Company'],
                           ContactPerson = self.cleaned_data['ContactPerson'],
                           email = self.cleaned_data['email'],
                           ABN = self.cleaned_data['ABN'])

Notice the change **within stars** above. :)

Lakshman Prasad
Thanks worked like a charm. Just pass the object created above into the other object. Genius!
Mark Underwood