Django查询返回多个用户而不是一个

时间:2018-07-26 08:19:45

标签: django

在仪表板上,我正在查询与用户模型具有一对一关系的配置文件模型。但是,我没有获得一个用户,因为每个用户只有一个配置文件,而是在数据库中拥有了所有用户和一个配置文件。我可能可以解决该问题,但是从安全角度来看,我担心以某种方式从数据库中获取所有用户。我检查了数据库字段,一切正常,所以代码出现了问题。这是代码:

class Profile(models.Model):
  user = models.OneToOneField(User, on_delete=models.CASCADE)
  firstname = models.CharField(max_length=100, blank=True)
  lastname = models.CharField(max_length=100, blank=True)
  city = models.CharField(max_length=100, blank=True)

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
 if created:
    Profile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
   instance.profile.save()

这是表格的代码:

class ProfileForm(forms.ModelForm):
 class Meta:
    model = Profile
    exclude = ['afield', 'anotherfield']
    labels = {
        'user': _('User Name'),
        'firstname': _('First Name'),
        'lastname': _('Last Name'),
        'city': _('City'),

这里是视图:

@login_required
def buy_subscription(request):
 if request.user.is_authenticated:
    if request.method == "POST":
        form = ProfileForm(request.POST, instance=request.user.profile)
        if form.is_valid():
            form.save()
    else:
            form = ProfileForm(instance=request.user.profile)
    return render(request, 'dashboard/mypage.html', {'form': form})
else:
    return redirect("login/")

模板是标准的

{% for field in form %}
{% render_field field  class="form-control" %}
{% endfor %}

这就是我在html方面得到的:

<select name="user" class="form-control" required id="id_user">
<option value="">---------</option>
<option value="61">User1</option>
<option value="62">User2</option>
<option value="63" selected>User3</option>
</select>

1 个答案:

答案 0 :(得分:1)

您看到的是一个字段,该字段允许您将OneToOneField的值更改为另一个用户。 (但是,如果所有用户都已经有个人资料,则更改它可能会失败。)

添加

exclude = ['user']

ProfileForm以避免在那里存在该字段。

我还建议您研究自定义用户模型,而不是使用旧的一对一的个人档案模型技术,以提高性能并减少麻烦:)