【问题标题】:Django edit profile not savingDjango编辑配置文件不保存
【发布时间】:2020-09-05 15:16:01
【问题描述】:

我已经为我的用户(django 用户 + 我的个人资料,其中包含更多信息)预先填写了表格,只是不想被保存。没有错误消息,没有重定向,我按下“编辑”按钮,然后...同一页面,修改已经写好。但数据库没有改变。

所以,这里是代码:

forms.py:

class UpdateUser(forms.ModelForm):
    email = forms.EmailField(required=True)

    class Meta:
        model = User
        fields = ('email', 'username')

    def clean_email(self):
        email = self.cleaned_data.get('email')
        username = self.cleaned_data.get('username')

        if email and User.objects.filter(email=email).exclude(username=username).count():
            raise forms.ValidationError('Cette adresse email est déjà utilisée, veuillez en indiquer une autre')
        return email


class UpdateProfil(forms.ModelForm):
    class Meta:
        model = Profil
        fields = ("society", "thingA", "thingB", "thingC", "thingD", "thingE")

views.py:

@login_required
def edit_profile(request):
    user = User.objects.get(username = request.user)
    profile = Profil.objects.get(user = user)
    if request.method == 'POST':
        form1 = UpdateUser(request.POST, instance=user)
        form2 = UpdateProfil(request.POST, instance=profile)
        if form1.is_valid() and form2.is_valid():
            form1.save()
            form2.save()
            return HttpResponseRedirect('Register/view_profile.html')
    else:
        form1 = UpdateUser(initial={"email": user.email, 
                                                        "username": user.username})
        form2 = UpdateProfil(initial={"society": profile.society, 
                                                        "thingA": profile.thingA, 
                                                        "thingB": profile.thingB, 
                                                        "thingC": profile.thingC, 
                                                        "thingD": profile.thingD, 
                                                        "thingE": profile.thingE})

    return render(request, 'Register/edit_profile.html', locals())

和模板:

    <form action="" method="post">
        {% csrf_token %}
        <p>Email : </p>{{ form1.email }}
        <p>Nom d'utilisateur : </p>{{ form1.username }}
        <p>Société (entreprise, association, établissement...") :</p> 
        {{ form2.society }}
        <p>Si vous êtes membres d'un ou plusieurs centres pilotes, veuillez les cocher ci-dessous :</p> 
        <p>thingA : {{form2.thingA }}</p>
        <p>thingB : {{form2.thingB }}</p>
        <p>thingC : {{form2.thingC }}</p>
        <p>thingD : {{form2.thingD }}</p> 
        <p>thingE : {{form2.thingE }}</p>
        
        <button type="submit">Editer</button>
    </form>

models.py

class Profil(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    deadline = models.DateField(blank=True, null=True,
                                default=None,
                                verbose_name="Date limite de validité")
    thingA = models.BooleanField(default=False)
    thingB = models.BooleanField(default=False)
    thingC = models.BooleanField(default=False)
    thingD = models.BooleanField(default=False)
    thingE = models.BooleanField(default=False)
    society = models.CharField(max_length = 255, 
                                blank=True, null=True,
                                verbose_name="Société",
                                help_text="Le nom de votre entreprise, association, établissement...")

    def __str__(self):
        return "Profil de {0}".format(self.user.username)
    

在尝试了不同的事情并阅读了关于该主题的所有内容但没有找到有效的解决方案后,我尝试跳出框框思考:我认为这可能是因为我没有将密码放在表单中,但它应该不会在这里发挥作用吧?

那么,也许是权限问题?我尝试为这两个模型授予权限。还是不行……

感谢您的宝贵时间,并为我的英语错误感到抱歉...

【问题讨论】:

  • 将用户添加到数据库或通过 python shell 更改数据库值时会发生什么
  • 它工作正常,我可以通过站点或面板管理员添加用户,我可以通过面板管理员进行修改,但不能通过站点
  • 当您按下保存时,您会在终端中收到任何错误吗?
  • 能否请您发送您的数据库模型,因为这可能是一个问题
  • 终端没有错误,按预期保存。我用 de ProfilUser 编辑了我的帖子,对于用户来说,它来自 Django.auth

标签: django django-users


【解决方案1】:

所以,我稍微修改了我的代码,现在它可以工作了,我不知道为什么,如果有人知道,我会全神贯注! 我会把它放在这里,以防它对其他人有帮助。

所以,新视图的代码:

@login_required
def edit_profile(request):
    user = User.objects.get(username = request.user)
    profile = Profil.objects.get(user = user)
    if request.method == 'POST':
        form1 = UpdateUser(request.POST, instance=user)
        form2 = UpdateProfil(request.POST, instance=profile)
        if form1.is_valid() and form2.is_valid():
            form1.save()
            form2.save()
            return redirect("viewProfile") # Here is the only change I finished with

    else:
        form1 = UpdateUser(initial={"email": user.email, 
                                                        "username": user.username})
        form2 = UpdateProfil(initial={"society": profile.society, 
                                                        "thingA": profile.thingA, 
                                                        "thingB": profile.thingB, 
                                                        "thingC": profile.thingC, 
                                                        "thingD": profile.thingD, 
                                                        "thingE": profile.thingE})

    return render(request, 'Register/edit_profile.html', locals())

所以,我猜是 httpResponseRedirect 的问题,不知道为什么,因为没有错误,也没有保存任何内容,但是...我不会把礼物马放在嘴里!它现在正在工作。 2020 年突然看起来好多了!直到明天那是=P

感谢那些试图帮助我的人!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    相关资源
    最近更新 更多