Отношение к базе данных 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>
Если есть какая-то связь, которую я упускаю, пожалуйста, помогите
В настоящее время ваше представление создает новую 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=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)
В шаблоне можно отобразить данные связанной Author
модели для пользователя user
с помощью:
{{ user.author.fullname }}
{{ user.author.bio }}
Прямо сейчас я изменил сообщение, комментарий и ответ, чтобы иметь иностранный ключ
class Reply(models.Model):
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE
)
content = models.TextField()
date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.content[:100]
class Meta:
verbose_name_plural = "replies"
class Comment(models.Model):
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE
)
content = models.TextField()
date = models.DateTimeField(auto_now_add=True)
replies = models.ManyToManyField(Reply, blank=True)
def __str__(self):
return self.content[:100]
class Post(models.Model):
title = models.CharField(max_length=400)
slug = models.SlugField(max_length=400, unique=True, blank=True)
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE
)
content = HTMLField()
categories = models.ManyToManyField(Category)
date = models.DateTimeField(auto_now_add=True)
approved = models.BooleanField(default=False)
tags = TaggableManager()
comments = models.ManyToManyField(Comment, blank=True)
Но вы хотите, чтобы я использовал from author на всех 3 вместо этого? вот так, показывая на классе комментариев
class Comment(models.Model):
user = models.ForeignKey(Author) #Like this?
content = models.TextField()
date = models.DateTimeField(auto_now_add=True)
replies = models.ManyToManyField(Reply, blank=True)
def __str__(self):
return self.content[:100]