Ayodele Ashad
Ayodele Ashad

Reputation: 87

How to store user details without asking the user?

I am trying to store user details with the PhoneBook and Contacts he creates so that I will be able to show the PhoneBook and Contacts that have been created by them.

I don't want the user to explicitly add the details himself. It should be handled by the backend.

I am successfully able to store the user details with the PhoneBook he created, but when I try to do the same thing with contacts, I am getting an attribute error.

models.py

class PhoneBook(models.Model):
    name = models.CharField(max_length=10, blank=False)
    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)

    def __str__(self):
        return self.name


class Contact(models.Model):
    first_name = models.CharField(max_length=50, blank=False)
    last_name = models.CharField(max_length=50, blank=False)
    phone_number = models.CharField(max_length=13, blank=False, unique=True)
    phone_book = models.ManyToManyField(PhoneBook, related_name='phone_book')
    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)

    def __str__(self):
        return self.phone_number

views.py

@login_required
def create_phone_book(request):
    form = CreatePhoneBookForm(request.POST or None)
    form.instance.user = request.user
    if form.is_valid():
        form.save()
        form = CreatePhoneBookForm()

    context = {'form': form}

    return render(request, 'CallCenter/create_phone_book.html', context)


@login_required
def add_to_phone_book(request):
    form = AddToPhoneBookForm(request.POST or None)
    form.instance.user = request.user

    if form.is_valid():
        form.save()
        form = AddToPhoneBookForm()

    context = {'form': form}
    return render(request, 'CallCenter/add_to_phone_book.html', context)

forms.py

class AddToPhoneBookForm(forms.Form):
    class Meta:
        model = Contact
        fields = ['first_name', 'last_name', 'phone_number', 'phone_book']


class CreatePhoneBookForm(forms.Form):

    class Meta:
        model = PhoneBook
        fields = ['name']

The error I am getting is AttributeError at /call-center/add/

'AddToPhoneBookForm' object has no attribute 'instance'

Upvotes: 1

Views: 50

Answers (1)

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 476534

You should make use of a ModelForm, not a Form. A Form itself has no instance, so you can define:

class AddToPhoneBookForm(forms.ModelForm):
    class Meta:
        model = Contact
        fields = ['first_name', 'last_name', 'phone_number', 'phone_book']


class CreatePhoneBookForm(forms.ModelForm):

    class Meta:
        model = PhoneBook
        fields = ['name']

Usually when you make a successful post request, you should redirect, to implement the Post/Redirect/Get pattern [wiki].

Upvotes: 2

Related Questions