用户配置文件的 Django 模型表单不会预填充

Django model form for user profile won't pre-populate

我在models.py中做了一个剖面模型:

class Profile(models.Model):
   user = models.OneToOneField(User)
   title = models.CharField(max_length=20, default='title')
   firstname = models.CharField(max_length=40, default='firstname')
   lastname = models.CharField(max_length=40, default='lastname')
   blurb = models.CharField(max_length=500, default='tell us about yourself')

   #work out how to make filename equal the username
   pic = models.ImageField(default="static/profile/blank.png", upload_to='static/profile/%d%m%y.jpg')  #+ user.pk + '.jpg') 

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

这里是编辑登录用户个人资料的页面视图:

def editprofile(request):
   u_p = request.user.profile
   template = loader.get_template('registration/editprofile.html')

   if request.method == 'POST':
      form = ProfileForm(request.POST, instance=u_p)
      if form.is_valid():
          form.save()
      else:
          # todo
          None
   else:
      #todo

context = RequestContext(request, {'form': form})
return HttpResponse(template.render(context))

模板片段如下:

<form method="POST" action=".">
  {% csrf_token %}
  <div class="regformout">
    <div class="regform">
        {% for field in form %}
            <div class='cell'> {{ field.label_tag }} </div>
            <div class='nogin'> {{ field.errors }} </div>
            <div class='cell'> {{ field }} </div>
        {% endfor %}
    </div>
  </div>

  <input class="btn btn-large btn-primary" type="submit" value="Save Your Profile" ></input>
</form>

我希望表单域自动填充相应页面上当前用户的数据以编辑个人资料。但是,无论我尝试什么,我都无法做到这一点。我在这里做错了什么?

您的主要问题是您仅在用户点击提交按钮时填充表单,因此当最初请求视图时,您的表单是空的。

from django.shortcuts import render, redirect

def editprofile(request):
    u_p = request.user.profile
    form = ProfileForm(request.POST or None, instance=u_p)
    if request.method == 'POST':
        if form.is_valid():
            form.save()
            return redirect('/')
    return render(request,
                  'registration/editprofile.html', {'form': form})