Отношение к базе данных 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]

Вернуться на верх