Как получить данные из модели базы данных django
Что я сделал:
views.py
class CandidateView(View):
def get(self, request, **kwargs):
pk = kwargs['pk']
candidates = Resume.objects.get(pk=pk)
posts = Post.objects.all().values()
post_contents = []
for post in posts:
if isinstance(post, dict) :
continue
elif isinstance(post, Post):
post_contents.append(post.content)
return render(request, 'blog/candidate.html', {'candidate':candidates, 'posts': post_contents})
models.py
class Resume(models.Model):
name = models.CharField(max_length=100)
dob = models.DateField(auto_now=False, auto_now_add=False)
gender = models.CharField(max_length=100)
locality = models.CharField(max_length=100)
city = models.CharField(max_length=100)
pin = models.PositiveIntegerField()
state = models.CharField(choices=STATE_CHOICE, max_length=50)
mobile = models.PositiveIntegerField()
email = models.EmailField()
job_city = models.CharField(max_length=50)
profile_image = models.ImageField(upload_to='profileimg', blank=True)
my_file = models.FileField(upload_to='doc', blank=True)
blog_post = models.CharField(max_length=100000)
class Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
date_posted = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)
resume = models.ForeignKey(Resume, on_delete=models.CASCADE, related_name='posts', null=True, blank=True)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('post-detail', kwargs={'pk': self.pk})
Я новичок в Django и хочу получить содержимое моего блога из модели Post в CandidateView. Основная идея - получить все содержимое блога и отобразить его в резюме. Но я не могу понять, как это сделать или что я делаю не так.
Основной проблемой является вызов Post.objects.all().values()
, а именно .values()
, если вы уберете его, то ваш код должен работать. .values()
возвращает список диктов, поэтому сейчас вы продолжаете работу, когда это дикт, что и является основной проблемой
Все эти решения будут работать. Скорее всего, вам следует воспользоваться решением 4 и передать актуальные объекты Post в шаблон, таким образом вы сможете получить доступ к другим атрибутам, например title
Решение 1
Remove .values
(цикл по объектам Post)
posts = Post.objects.all()
post_contents = []
for post in posts:
post_contents.append(post.content)
Решение 2
use .values
(цикл по списку dicts)
posts = Post.objects.all().values()
post_contents = []
for post in posts:
post_contents.append(post["content"])
Решение 3
используйте .values
"правильно", передавая поле. Затем flat=True
удалите цикл
post_contents = Post.objects.all().values("content", flat=True)
Выходные данные для #3
с flat=true
post_contents = ["content1", "content2"]
без flat=true
(для этого потребуется цикл типа #2)
post_contents = [{"content": "content1"}, {"content": "content2"}]
Решение 4
передайте сами объекты Post в представление (предпочтительно)
data = {
'candidate':candidates,
'posts': Post.objects.all()
}
return render(request, 'blog/candidate.html', data)
Вид для #4
Пройдитесь по постам внутри шаблона
{% for post in posts %}
{{ post.content }}
{{ post.title }}
{% endif %}