在仪表板上,我正在查询与用户模型具有一对一关系的配置文件模型。但是,我没有获得一个用户,因为每个用户只有一个配置文件,而是在数据库中拥有了所有用户和一个配置文件。我可能可以解决该问题,但是从安全角度来看,我担心以某种方式从数据库中获取所有用户。我检查了数据库字段,一切正常,所以代码出现了问题。这是代码:
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>
答案 0 :(得分:1)
您看到的是一个字段,该字段允许您将OneToOneField的值更改为另一个用户。 (但是,如果所有用户都已经有个人资料,则更改它可能会失败。)
添加
exclude = ['user']
到ProfileForm
以避免在那里存在该字段。
我还建议您研究自定义用户模型,而不是使用旧的一对一的个人档案模型技术,以提高性能并减少麻烦:)