【问题标题】:Django model form for user profile won't pre-populate用户配置文件的 Django 模型表单不会预先填充
【发布时间】:2015-08-15 19:27:55
【问题描述】:

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

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>

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

【问题讨论】:

  • 如果request.method 不是“POST”,则您的表单没有被初始化。你应该检查你的代码!这通常会引发错误,因为您在为 GET 请求初始化之前使用form
  • 模板中的请求方式为post。此外,将行:'form = ProfileForm(request.POST, instance=u_p)' 放在任何 POST/GET 测试之外仍然无法正常工作。您的建议很好,但这里还有其他问题。

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


【解决方案1】:

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

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})

【讨论】:

  • 感谢您的帮助,但是,这仍然没有发生!我真的不明白为什么不这样做,因为我确信我已经以几乎相同的方式制作了另一种表格。一定有什么傻事。
  • 可能是用户未登录,因为您没有对此进行检查。
  • 我有另一个页面来查看当前配置文件,它读取当前用户的配置文件并显示它。这是有效的,所以我认为用户已登录。
  • 啊,基本如你所说。有一条冲突的行也在不应该出现的地方初始化表单。你的方法现在有效。谢谢。
猜你喜欢
  • 2015-09-02
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 2017-01-18
  • 2012-07-20
  • 1970-01-01
  • 2014-04-03
  • 2020-07-03
相关资源
最近更新 更多