如何在Django中自动填充可编辑表单

时间:2019-03-22 14:14:23

标签: python django

tl; dr如何使用数据库中存储的信息自动填充可编辑表单

嘿,我使用Django作为框架为应用程序创建了配置文件页面。我在用户编辑页面时遇到一些烦人的问题。现在,用户必须重新输入表单中的每个字段,才能编辑单个字段。.因为我的视图必须删除每个字段中的先前信息,否则我会遇到一些烦人的错误。

所以我的问题是,是否有一种方法可以用数据库中与表单中每个字段相对应的字符串自动填充profile_edit.html中的这些字段?

任何帮助将不胜感激:D

view.py

@login_required
def profile_edit(request):
form = ProfileUpdateForm(request.POST, request.FILES)

if request.method == 'POST':

    if form.is_valid():
        user = request.user
        if 'image' in request.FILES:

            user.profile.image = request.FILES['image']
        user.profile.bio = form.cleaned_data.get("bio")
        user.profile.birth_date = form.cleaned_data.get("birth_date")
        user.profile.location = form.cleaned_data.get("location")
        user.save()
        return redirect('profile')
    else:
        form = ProfileUpdateForm()

context = {
    'form' : form

}
return render(request, 'webside/profile_edit.html', context)

models.py

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField(max_length=500, blank=True)
    location = models.CharField(max_length=30, blank=True)
    birth_date = models.DateField(null=True, blank=True)
    email_confirmed = models.BooleanField(default=False)
    image= models.FileField(upload_to='profile_image/', blank = True)

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

profile_edit.html

'{% csrf_token %}
          {% for field in form %}
            <p>
              {{ field.label_tag }}<br>
              {{ field }}

              {% for error in field.errors %}
                <p style="color: red">{{ error }}</p>
              {% endfor %}
            </p>
          {% endfor %}'

pic of profile.html forms.py

class ProfileUpdateForm(forms.ModelForm):
YEARS= [x for x in range(1900,2021)]
birth_date = forms.DateField( initial="21-06-1995", widget=forms.SelectDateWidget(years=YEARS))
class Meta:
    model = Profile
    fields = ('bio','birth_date','location','image')

1 个答案:

答案 0 :(得分:1)

在视图中初始化表单的方式都是错误的:

def profile_edit(request):
    user = request.user
    # form = ProfileUpdateForm(request.POST, request.FILES) <-- remove

    if request.method == 'POST':
        form = ProfileUpdateForm(request.POST, request.FILES, instance=user.profile)
        if form.is_valid():
            form.save()  # <-- you can just save the form, it will save the profile
            # user.save()  <-- this doesn't help you, it doesn't save the profile and since user isn't changed you don't need to save it!
            return redirect(...)
        # else:
        #    form = ProfileUpdateForm()  <-- don't clear the form!

    else:  # GET
        form = ProfileUpdateForm(instance=user.profile) <-- initialise with instance

    context = {
        'form' : form
    }
    return render(request, 'webside/profile_edit.html', context)

您需要将instance添加到表单中以更新现有实例。如果表单无效,则不应初始化一个空表单,因为这意味着用户如果输入错误,则会丢失所有数据。您想要显示包含所有数据和错误的表格。