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
.