Django 数据库关系



我正在使用 django 在论坛上工作,我从我拥有的模型类访问用户全名和简历时遇到问题。 我访问user.username 或 user.email 没有问题,但不是来自 Author 类。

这是来自论坛应用程序中的 models.py

User = get_user_model()
class Author(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
fullname = models.CharField(max_length=40, blank=True)
slug = slug = models.SlugField(max_length=400, unique=True, blank=True)
bio = HTMLField()
points = models.IntegerField(default=0)
profile_pic = ResizedImageField(size=[50, 80], quality=100, upload_to="authors", default=None, null=True, blank=True)
def __str__(self):
return self.fullname

我的表单在用户应用程序中,我有一个个人资料更新站点,表单如下所示

from forums.models import Author
class UpdateForm(forms.ModelForm):
class Meta:
model = Author
fields = ('fullname', 'bio', 'profile_pic')

然后这是一些更新站点,但是没有什么让我可以访问生物或全名,我已经尝试了很多组合。 我在这里迷路了。

{% block content %}
<section class="section" id="about">
<!-- Title -->
<div class="section-heading">
<h3 class="title is-2">Hey {{ user.username }}</h3>
<div class="container">
<p>{{  user.bio }}bio comes here</p>
</div>
</div>

这是来自用户应用程序的 view.py

from .forms import UpdateForm
def update_profile(request):
context = {}
user = request.user
instance = Author.objects.filter(user=user).first()
if request.method == 'POST':
form = UpdateForm(request.POST, request.FILES, instance=user)
if form.is_valid():
form.instance.user = user
form.save()
return redirect('/')
else:
form = UpdateForm(instance=user)
context.update({
'form': form,
'title': 'update_profile',
})
return render(request, 'register/update.html', context)

表单 html

<form method="POST" action="." enctype="multipart/form-data">
{% csrf_token %}    
{{form|crispy}}
<hr>
<button class="button is-block is-info is-large is-fullwidth">Update <i class="fa fa-sign-in" aria-hidden="true"></i></button>
</form>

如果我缺少一些关系,请帮助

每次"更新"模型时,视图当前都会创建一个新的Author记录。我建议首先清理数据库并删除所有作者。

然后,您可以在此处将ForeignKey转换为OneToOneField: 这样我们就知道每个用户最多有一个Author

from django.conf import settings
class Author(models.Model):
user = models.OneToOneField(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE
)
# …

现在,我们可以更改视图以在没有此类记录的情况下创建记录,或者更新现有记录(如果有):

from .forms import UpdateForm
def update_profile(request):
context = {}
user = request.user
instance = Author.objects.filter(user=user).first()
if request.method == 'POST':
form = UpdateForm(request.POST, request.FILES, instance=instance)
if form.is_valid():
form.instance.user = user
form.save()
return redirect('/')
else:
form = UpdateForm(instance=instance)
context.update({
'form': form,
'title': 'update_profile',
})
return render(request, 'register/update.html', context)

在模板中,您可以为用户user呈现相关Author模型的数据:

{{ user.author.fullname}}
{{ user.author.bio}}

最新更新