/ accounts / signup /'str'对象上的AttributeError没有属性'add'

时间:2018-12-31 09:30:04

标签: python django

是django的新功能,所以我在tutorial上使用了使用用户配置文件扩展用户模型的实际示例,在form.py上遇到了麻烦,在删除此行时出现了该错误; Supervisor.su_mobile_number.add(* self.cleaned_data.get('su_mobile_number')) 可以正常运行,但是没有在数据库中插入su_mobile_number的数据

view.py

class SupervisorSignUpView(CreateView):
     model = User
     form_class = SupervisorSignUpForm
     template_name = 'registration/signup_form.html'

def get_context_data(self, **kwargs):
    kwargs['user_type'] = 'supervisor'
    return super().get_context_data(**kwargs)

def form_valid(self, form):
    user = form.save()
    login(self.request, user)
    return redirect('home')

model.py

class User(AbstractUser):
   is_supervisor = models.BooleanField(default=False)
   is_student = models.BooleanField(default=False)


class Supervisor(models.Model):
   user = models.OneToOneField('User', on_delete=models.CASCADE, primary_key=True, related_name='supervisor')
   su_mobile_number = models.CharField(max_length=200)

forms.py

class SupervisorSignUpForm(UserCreationForm):
 su_mobile_number = forms.CharField()

class Meta(UserCreationForm.Meta):
    model = User

@transaction.atomic
def save(self):
    user = super().save(commit=False)
    user.is_supervisor = True
    user.save()
    supervisor = Supervisor.objects.create(user=user)
    supervisor.su_mobile_number.add(*self.cleaned_data.get('su_mobile_number'))
    return user

1 个答案:

答案 0 :(得分:2)

使用 = 运算符分配值,然后调用 save() 方法

@transaction.atomic
def save(self):
    user = super().save(commit=False)
    user.is_supervisor = True
    user.save()
    supervisor = Supervisor.objects.create(user=user)
    supervisor.su_mobile_number = self.cleaned_data.get('su_mobile_number')
    supervisor.save()
    return user

更短的方法是(如@Abdul Niyas P M所述)

@transaction.atomic
def save(self):
    user = super().save(commit=False)
    user.is_supervisor = True
    user.save()
    supervisor = Supervisor.objects.create(user=user, su_mobile_number=self.cleaned_data.get('su_mobile_number'))
    return user