Home > Mobile >  I am trying to register a staff in my database throuout the form But I get error
I am trying to register a staff in my database throuout the form But I get error

Time:01-10

I have two models staff and UserAddress and I'm trying to add the staff through models. But I get this error: AttributeError at /accounts/signup/staff/ 'NoneType' object has no attribute 'add' What should I do now, Could some one help me? I wanted to register a staff but this thing happened.

models.py:

class UserAddress(models.Model):
    city = models.CharField(max_length=100)
    address = models.CharField(max_length=200)
    zip_code = models.CharField(max_length=15, blank=True)

    def __str__(self):
        return str(self.id)


class CustomUser(AbstractUser):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    email = models.EmailField(unique=True)
    user_address = models.ForeignKey(UserAddress, on_delete=models.CASCADE, null=True)


class Staff(CustomUser):
    def save(self, *args, **kwargs):
        if not self.id:
            self.is_staff = True
            self.is_superuser = False
            return super(Staff, self).save(*args, **kwargs)

    class Meta:
        proxy = True

forms.py:

class StaffCreationForm(UserCreationForm):
    first_name = forms.CharField(max_length=100, required=True)
    last_name = forms.CharField(max_length=100, required=True)
    email = forms.EmailField(required=True)

    city = forms.CharField(max_length=100)
    address = forms.CharField(max_length=100)
    zip_code = forms.CharField(max_length=15, required=True)

    class Meta(UserCreationForm.Meta):
        model = CustomUser

    @transaction.atomic
    def save(self):
        user = super().save(commit=False)
        user.first_name = self.cleaned_data.get("first_name")
        user.last_name = self.cleaned_data.get("last_name")
        user.email = self.cleaned_data.get("email")
        user.is_staff = True
        user.save()

        address = UserAddress.objects.create(city=self.cleaned_data.get("city"),
                                             address=self.cleaned_data.get("address"),
                                             zip_code=self.cleaned_data.get("zip_code"))

        user.user_address.add(address)

        return user

views.py:

class StaffSignUpView(CreateView):
    model = CustomUser
    form_class = StaffCreationForm
    template_name = "accounts/signup_user.html"

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

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

CodePudding user response:

Your user.user_address object does not contain any value that is why you're getting this error
'NoneType' object has no attribute 'add' because default it's value is None and None datatype does not contain add() method so try this

 user.user_address = address
 user.save() # don't forget to save user

this will assign address object to user.user_address

  •  Tags:  
  • Related