Django having trouble linking a UserProfile to User
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 som开发者_运维知识库ething 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
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. :)
精彩评论