Как фильтровать по автору в Django? Получаю ошибку: В поле 'id' ожидается число
У меня есть приложение Django, которое функционирует как дневник, где главная страница представляет собой индексный список всех ранее созданных записей дневника. Сейчас я пытаюсь отфильтровать индекс так, чтобы пользователь видел только те записи дневника, которые он создал. Вот что я сделал:
Views.py
from django.shortcuts import render
from .models import DiaryEntry
from django.views import generic
from django.views.generic.edit import CreateView
def index(request):
"""View function for MyDiary."""
author = DiaryEntry.author
diary_entry = DiaryEntry.objects.filter(author=author).order_by('-created_on')
context = {
"diary_entry": diary_entry,
}
return render(request, 'diary_index.html', context=context)
class EntryDetailView(generic.DetailView):
model = DiaryEntry
def get_data(self, **kwargs):
context = super(EntryDetailView, self).get_data(**kwargs)
return context
class EntryCreate(CreateView):
model = DiaryEntry
fields = ['title', 'content']
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
Models.py
from django.db import models
from django.urls import reverse
from django.conf import settings
User = settings.AUTH_USER_MODEL
class DiaryEntry(models.Model):
title = models.CharField(max_length=255)
content = models.TextField()
created_on = models.DateTimeField(auto_now_add=True)
author = models.ForeignKey(User,
on_delete = models.CASCADE
)
def __str__(self):
"""String for representing the diary object."""
return self.title
def get_absolute_url(self):
"""Returns the url to access a detail record for this user entry."""
return reverse('entry-detail', args=[str(self.id)])
HTML:
{% extends "base.html" %}
{% block page_content %}
<div class="col-md-8 offset-md-2">
<h1>This is your diary!</h1>
<hr>
<h2>Here, you can write about anything you want to.</h2>
<br>
<div class="text-center">
<a class="btn btn-primary" href="{% url 'entry-create' %}" role="button">Create a new diary entry</a>
</div>
<br>
<br>
{% for entry in diary_entry %}
<h2><a href="{% url 'entry-detail' entry.pk %}">{{ entry.title }}</a></h2>
<small>
{{ entry.created_on.date }} |
</small>
<p>{{ entry.content | slice:":400" }}...</p>
{% endfor %}
</div>
{% endblock %}
И URL-адреса:
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='diary_index'),
path('entry_detail/<int:pk>/', views.EntryDetailView.as_view(), name='entry-detail'),
path('entry/create/', views.EntryCreate.as_view(), name='entry-create'),
]
Когда я запускаю вышеописанное, я получаю следующую ошибку: Field 'id' expected a number but got <django.db.models.fields.related_descriptors.ForwardManyToOneDescriptor object at 0x7f12feef3400>.
Может ли кто-нибудь помочь мне решить эту проблему? Я просмотрел другие ответы на подобные вопросы, но я все еще не могу понять, как правильно фильтровать записи по автору.
Заранее спасибо!
Проблема заключается в этой строке author = DiaryEntry.author
. Если вы хотите фильтровать по автору, вам нужно иметь автора, по которому фильтровать, эта строка только выбирает свойство, она не дает вам автора. Рассмотрим этот пример:
author = Author.objects.get(id=1)
diary_entry = DiaryEntry.objects.filter(author=author).order_by('-created_on')
Это отфильтрует записи дневника по автору с идентификатором 1. Вы даже можете сделать это в одной строке, чтобы не запрашивать дважды:
diary_entry = DiaryEntry.objects.filter(author__id=1).order_by('-created_on')
Надеюсь, это имеет смысл. Итак, вопрос к вам: по какому автору вы хотите фильтровать, как получить этого автора?