Django表单中的自动填充用户

时间:2017-11-08 09:06:03

标签: python django

在我的项目中,一旦用户注册,它就会被重定向到更新视图,在那里他必须填写此信息。由于用户在注册后也自动登录,我希望自动填写该用户字段并且无法编辑

models.py

class Userpro(models.Model):
    user = models.OneToOneField(User)
    dob = models.DateField(default=datetime.date.today)
    country = models.CharField(max_length=50, default='')
    qualification = models.CharField(max_length=10, choices=CHO, 
default='No')
    university = models.CharField(max_length=100, default='')
    location = models.CharField(max_length=100, default='')

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

forms.py

class UserProForm(forms.ModelForm):
    class Meta:
        model = Userpro
        fields = '__all__'

views.py

def update(request):
    if request.method == 'POST':
        form = UserProForm(request.POST or None)
        if form.is_valid():
            form.save()
            return redirect('/')
        else:
            redirect('/')
    else:
        form = UserProForm()
        return render(request, 'app/update.html', {'form': form})

导入所有必需的库。

3 个答案:

答案 0 :(得分:1)

您可以将widgets用于表单。像这样的东西(下面的代码未经过测试)。

from django.forms import TextInput


class UserProForm(forms.ModelForm):
    class Meta:
        model = Userpro
        fields = '__all__'
        widgets = {
            'user': TextInput(attrs={'readonly': 'readonly'})
        }

def update(request):
    instance = Userpro.objects.filter(user=request.user).first()
    if request.method == 'POST':
        form = UserProForm(request.POST, instance=instance)
        if form.is_valid():
            form.save()
            return redirect('/')
        else:
            return redirect('/')
    else:
        form = UserProForm(instance=instance)
        return render(request, 'app/update.html', {'form': form})

编辑:我们应该像这样在dict中传递用户: form = UserProForm({'user': request.user})

编辑2:您应首先找到配置文件对象,然后将其传递给表单

instance = Userpro.objects.filter(user=request.user).first()
form = UserProForm(request.POST, instance=instance)

答案 1 :(得分:1)

我认为如果你将ModelForm与你想要修改的字段一起使用并且在模板中显示对象实例值那样会更好。

from django.forms import TextInput


class UserProfileForm(forms.ModelForm):
    class Meta:
        model = Userprofile
        fields = ('field1', 'field2')

def update(request):
    if request.method == 'POST':
        form = UserProfileForm(request.POST or None)
        if form.is_valid():
            form.save()
            return redirect('/')
        else:
            redirect('/')
    else:
        form = UserProfileForm(user=request.user)
        return render(request, 'app/update.html', {'form': form})


# template
   <form method="post">
        {% csrf_token %}

        <div class="form-row">
            {{ form.field1.errors }}
            {{ form.field1.label_tag }} {{ form.field1 }}
        </div>
        <div class="form-row">
            {{ form.field2.errors }}
            {{ form.field2.label_tag }} {{ form.field2 }}
        </div>
        <div class="form-row">
            {{ form.instance.field3.errors }}
            {{ form.instance.field3.label_tag }} {{ form.instance.field3 }}
        </div>
    </form>

答案 2 :(得分:1)

我遇到了同样的问题。我找到的解决方案非常简单。 首先删除 forms.py 中的“用户”字段

他们在视图中:

if form.is_valid():
    obj = form.save(commit=False)
    obj.user = request.user
    obj.save()

通过将 obj 设置为保存的表单(但未在数据库中提交),您可以像将用户设置为 request.user 一样对其进行管理;他们保存。

注意 obj."你在模型中输入的名称"