代码之家  ›  专栏  ›  技术社区  ›  Mark Lakewood

Django无法将用户配置文件链接到用户

  •  1
  • Mark Lakewood  · 技术社区  · 16 年前

    我现在只是想填一下报名表。所以新用户可以注册。我可以创建新用户,但是当我将UserProfile对象保存到数据库时,它失败了

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

    其中“克莱尔”是我输入的用户名。此用户是在Auth.user中创建的,但是没有创建UserProfile,在本例中称为Customer。所以我认为我在创建对象和使用外键时做了一些错误的事情。以下是相关文件。

    型号.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
    

    表单.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'])
    

    视图.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,
        })
    

    我让作者这样想

    干杯 做记号

    1 回复  |  直到 16 年前
        1
  •  2
  •   lprsd    16 年前
    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'])
    

    注意这个变化 **within stars** 以上:)