#python #django #sqlite #django-views
#python #django #sqlite #django-views
Вопрос:
Итак, я довольно новичок в django, и я пытаюсь создать веб-сайт, который ведет журнал о том, кто последним вывез собак своих семей. Я сделал так, чтобы мои модели включали таблицы для каждого отдельного сообщения, dog и их действий, которые соответствуют самим сообщениям. Я хочу сделать так, чтобы список сообщений был размещен в порядке от последнего к самому раннему сообщению, за которым следуют все действия, которые выполняла каждая собака (т. Е. Если есть два объекта dog, тогда будут два объекта action, которые сопровождают сообщение).
models.py:
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
class Dog(models.Model):
name = models.CharField(max_length = 20)
class Post(models.Model):
walker = models.ForeignKey(User, on_delete = models.CASCADE)
time_posted = models.DateTimeField(default = timezone.now)
issues = models.TextField(max_length = 300)
class Action(models.Model):
post = models.ForeignKey(Post, on_delete = models.CASCADE)
dog = models.ForeignKey(Dog, on_delete = models.CASCADE)
peed = models.BooleanField(default = False)
pooped = models.BooleanField(default = False)
views.py:
from django.shortcuts import render
from django.views.generic import ListView, CreateView
from .models import Post, Dog, Action
from django.http import HttpResponse
class ActionList(ListView):
def home(request):
context = {
'posts': Post.objects.all(),
'actions': Action.objects.all(),
'dogs': Dog.objects.all()
}
return render(request, 'dog_log_app/home.html', context)
main.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Home</title>
</head>
<body>
<div>
<h1>Home</h1>
<!-- displays user info -->
{% if user.is_authenticated %}
<h2>Current Logged in User is {{request.user.username}}</h2>
<a href = "{% url 'logout' %}">Logout</a>
{% else %}
<a href = "{% url 'login' %}">Login</a>
<a href = "{% url 'register' %}">Register</a>
{% endif %}
<br>
<h2>Posts:</h2>
{% for post in posts %}
<h3>person walking: {{post.walker}}</h3>
<h4>time walked: {{post.time_posted}}</h4>
<h4>issues: {{post.issues}}</h4>
{% for action in actions %}
{{ACTIONS CORRESPONDING TO POST}}
{% endfor %}
{% endfor %}
</div>
</body>
</html>
Как будет выглядеть идеальный пост:
- Walker: [generic_user]
- Пройденное время: [дата и время]
- Проблемы: [есть проблемы]
- Dog1: пописал и покакал
- Dog2: Pooped
Я знаю, как форматировать данные действия, чтобы они выглядели так, как указано выше. Мне просто трудно пытаться объединить объекты action с объектом post. Если что-то из этого сбивает с толку, я прошу прощения. Опубликуйте ниже все, что нуждается в разъяснении. Спасибо!
Ответ №1:
Вы можете получить доступ к обратной стороне a ForeignKey
через менеджер, который имеет то же имя, что и related_name=…
параметр [Django-doc] . По умолчанию значение равно classname_set
. Итак, в этом случае вы можете получить элементы с помощью:
{% for action in post.action_set.all %}
…
{% endfor %}
таким образом, вы можете записать это как:
{% for action in post.action_set.all %}
{{ action.dog.name }}: {% if action.peed %}peed{% endif %} {% if action.pooped %}pooped{% endif %}
{% endfor %}
Комментарии:
1. о, ты был так быстрее 🙂
2. Вау, о боже, это мне так помогло. Вы понятия не имеете, как долго я застрял на этом. Большое вам спасибо за помощь!