【问题标题】:Cannot link my form information with the User无法将我的表单信息与用户链接
【发布时间】:2019-01-06 17:31:59
【问题描述】:

我有一个编辑页面,您可以在其中编辑您注册的个人信息,例如用户名、名字、姓氏、电子邮件。但是在页面内我有一些额外的字段,例如描述,城市,网站字段,如果您愿意,您可以将其添加/编辑到您的个人资料中。但是在我编辑个人信息并填写额外字段以进行测试并按确认后按钮,个人信息编辑成功,没有出现错误。但问题是当我在 Django 管理员检查数据时,UserExtraField 模型是空的。我希望我的解释足够好。

问题是我无法将额外字段保存给登录的用户,但个人信息编辑工作正常,只是额外字段无法保存给该人。我希望用户能够编辑他们的个人资料,如果他们愿意,还可以添加/编辑额外的字段。当他们编辑他们的个人资料时,我想添加一些字段,以便他们可以在他们的个人资料中获得更多信息。

下面也有图片链接,谢谢。

views.py 文件

def UserProfileEdit(request):
    if request.method == 'POST':
        form_edit = EditForm(request.POST, instance= request.user)
        form_extra = UserExtra(request.POST,instance=request.user)

        if form_edit.is_valid() and form_extra.is_valid():
            edit = form_edit.save()
            extra = form_extra.save()
            extra.user = edit
            return redirect('/userprofile/user')
    else:
        form_edit = EditForm(instance = request.user)
        form_extra = UserExtra(instance = request.user)
        user_edit = {'form_edit':form_edit,'form_extra':form_extra}
        return render(request,'user_profile/user_edit.html',context=user_edit) 

forms.py

class EditForm(UserChangeForm):

    class Meta():
        model = User
        fields = ('username', 'first_name', 'last_name', 'email', "password")

#make another forms for extra profile imformation
class UserExtra(forms.ModelForm):

    class Meta():
        model = UserExtraProfile
        fields = ('description','city','website')

models.py

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
# Create your models here.


class UserExtraProfile(models.Model):
    #inherit the User model pk
    user = models.OneToOneField(User, on_delete = models.CASCADE)
    description = models.CharField(max_length= 250,default= '')
    city = models.CharField(max_length=250,default= '')
    website = models.URLField(blank= True,default= '')
    # image = models.ImageField(upload_to='media/profile_pic', blank=True)

    def __str__(self):
        return self.user.username

def create_profile(sender,**kwargs):
    if kwargs['created']:
        user_profile = UserExtraProfile.objects.create(user=kwargs['instance'])
post_save.connect(create_profile, sender = User)

user_edit.html

{% extends 'base.html'%}
{% load bootstrap3 %}
{% load staticfiles %}

{% block content %}
<div class="container">
  <h1>User Profile Edit</h1>
  <form  method="POST">
    {% csrf_token %}
    {% bootstrap_form form_edit %}
    {% bootstrap_form form_extra %}
    <input type="submit" class="btn btn-default" value="Confirm">

  </form>
</div>

{% endblock %}

enter image description here

【问题讨论】:

  • 也许我在描述中遗漏了它,但出了什么问题?你有错误吗?数据库条目是否没有正确关联?还是别的什么?
  • 不要使用两个单独的表格。为额外字段创建一个新表单或使 UserExtra 扩展 EditForm。
  • @wholevinski ,我在第一段中添加了一些解释。希望足够清楚。

标签: python django django-models django-forms django-views


【解决方案1】:

分配用户后您没有保存额外配置文件。在保存表单中使用commit=False,这样您就不会两次访问数据库。

user = form_edit.save()
extra = form_extra.save(commit=False)
extra.user = user
extra.save()

此外,您需要将配置文件而不是用户传递给配置文件表单。

form_extra = UserExtra(request.POST, instance=request.user.userextraprofile)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多