Skip to content
Advertisement

form registers as valid but does not update

This is a very weird phenomenon. Why is it that even though the form is valid, the values are not updated? It works if i do it in django admin though. I am not even receiving any errors. The form is just valid but its not being updated. Its as if they took the old values to update…

html:

<form action="{% url 'account:displayinfo' request.user.id %}" method="POST" enctype="multipart/form-data">{% csrf_token %}

{{ form.as_p }}

<div class="d-flex justify-content-center">
<button type="submit" class="btn btn-primary btn-sm col-lg-5">Update</button>
</div>

</form>

views.py

def display_information_view(request, *args, **kwargs):
    user_id = kwargs.get("user_id")
    account = Account.objects.get(pk=user_id)
    context = {}
    displayinfo = AccountDisplayInfo.objects.get(account=account)
    if request.method == "POST":
        form = DisplayInformationForm(request.POST, request.FILES, instance=request.user)
        if form.is_valid():
            info = form.save(commit=False)
            info.account = request.user
            info.save()
            messages.success(request, 'Your profile display information have been updated', extra_tags='editdisplayinfo')
            return redirect("account:view", user_id=account.pk)
        else:
            form = DisplayInformationForm(request.POST, instance=request.user,   
        initial={
            "instagram": displayinfo.instagram,
        }
       )

            context['form'] = form
    else:
        form = DisplayInformationForm(
        initial={
            "instagram": displayinfo.instagram,
            }
       )
        context['form'] = form
    return render(request, "account/displayinfo.html", context)

forms.py

class DisplayInformationForm(forms.ModelForm):
    class Meta:
        model = AccountDisplayInfo
        fields = ('instagram',)

models.py

class Account(AbstractBaseUser):
 email                  = models.EmailField(verbose_name="email", max_length=60, unique=True)
 username               = models.CharField(max_length=30, unique=True)

class AccountDisplayInfo(models.Model):
    account = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    instagram = models.CharField(max_length=50, unique=True, blank=True, null=True) #instagram


@receiver(post_save, sender=Account)
def create_AccountDisplayInfo(sender, instance, created, **kwargs):
    if created:
        AccountDisplayInfo.objects.create(account=instance)

Advertisement

Answer

You set the instance of the form to the incorrect model instance. Looking at your form it is a ModelForm for AccountDisplayInfo yet you pass the instance as instance=request.user. Change all such code to instance=displayinfo.

Advertisement