是什么导致奇怪的“UNIQUE约束失败:auth_user.username”错误?

时间:2016-06-26 08:34:17

标签: django

我尝试通过一对一的关系将用户模型中的数据插入到其他模型中。具体来说,我想将User的用户名,电子邮件和密码属性插入到其他模型中。在Addtional中,我打算在一个表单中创建User模型和其他模型。所以,我重写了modelform中的save方法。它部分工作,能够在模型和数据库中插入数据,除了抛出UNIQUE约束失败:auth_user.username错误。

在models.py

class Staff(models.Model):

  yes_or_no = ((True, 'Yes'),(False, 'No'))
  male_or_female = ((True,'Male'),(False,'Female'))

  user = models.OneToOneField(User, unique=True)

  gender = models.BooleanField(default = True, choices = male_or_female)
  birthday = models.DateField(default =None,blank = False, null = False)
  created = models.DateTimeField(default=datetime.now, blank=True)
  authorized = models.BooleanField(default=False,choices = yes_or_no) 
  store_id = models.ForeignKey(Store,default=1)

  @property
  def name(self):
    return self.user.username
  @property
  def email(self):
    return self.user.email
  @property
  def password(self):
    return self.user.password
  @property
  def first_name(self):
    return self.user.first_name
  @property
  def last_name(self):
    return self.user.last_name

  def __str__(self):
    return self.user.username

在forms.py

 class StaffForm(forms.ModelForm):
    name = forms.CharField(max_length=100)
    email= forms.EmailField(max_length=100, required=True)
    password = forms.CharField(max_length=50)

    store_id = forms.ModelChoiceField(queryset = Store.objects.all(),empty_label="--------") # select values ?
    first_name = forms.CharField(required = True,max_length=100)
    last_name = forms.CharField(required = True,max_length=100)

    class Meta:
        model = Staff
        fields = ('gender','birthday','authorized','store_id')
        widgets = {'authorized':forms.RadioSelect,
                   'gender':forms.RadioSelect,
                    'birthday':SelectDateWidget(years=range(date.today().year-50,date.today().year))
        }

    def save(self,*args,**kwargs):
        Staff = super(StaffForm,self).save(commit=False)
        user = User.objects.create(
            username=self.cleaned_data['name'], 
            first_name=self.cleaned_data['first_name'], 
            last_name = self.cleaned_data['last_name'],
            email= self.cleaned_data['email'])
        user.set_password(self.cleaned_data['password']) 
        if self.cleaned_data['authorized']:
            user.is_staff = True
        Staff.user = user
        Staff.save()

在views.py

@login_required(login_url='/dataInfo/login/')
def createstaff(request):

    # if this is a POST request we need to process the form data
    if request.method == 'POST':
        # create a form instance and populate it with data from the request:
        form = StaffForm(request.POST or None)
    # check whether it's valid:
        if form.is_valid():
            # process the data in form.cleaned_data as required
            form.save()

            return HttpResponseRedirect('/dataInfo/staff_view/')
    # if a GET (or any other method) we'll create a blank form
    else:
        form = StaffForm()
    return render(request, 'dataInfo/create_staff.html', {'form': form})

0 个答案:

没有答案