Estoy escribiendo un pequeño programa de chat en Django pero tengo problemas para avanzar.
Aquí está el código:
modelos.py
from django.db import models from datetime import datetime from django.utils import timezone class Chat(models.Model): chatname = models.CharField(max_length=100) description = models.TextField() created_at = models.DateTimeField(default=datetime.now, blank=True) def __str__(self): return self.chatname class Comment(models.Model): chat = models.ForeignKey(Chat, on_delete=models.CASCADE) commenter = models.CharField(max_length=30) comment = models.TextField() created_at = models.DateTimeField(default=datetime.now, blank=True) def __str__(self): return self.commenturls.py
from django.conf.urls import url from . import views from django.views.generic import ListView from chat.views import CommentList app_name = 'chats' urlpatterns = [ url(r'^$', views.index, name="index"), url(r'^comments/(?P<pk>[0-9]+)/$', views.CommentList.as_view(), name='comments'), ]vistas.py
from django.shortcuts import render, redirect from django.http import HttpResponse from django.contrib.auth import authenticate, login from django.views import generic from .models import Chat, Comment def index(request): username = None if request.user.is_authenticated(): username = request.user.username chats = Chat.objects.all()[:10] context = { 'chats':chats } return render(request, 'chat/index.html', context) class CommentList(generic.ListView): queryset = Comment.objects.filter(chat_id=1) context_object_name = 'comments'Mi comment_list.html
{% extends "chat/base.html" %} {% block content %} <a href="/chat/">Go back</a> <h3>Comments</h3> <h2>{{chat.id}}</h2> <ul> {% for comment in comments %} <li>{{ comment.commenter }}: {{ comment.comment }}</li> {% endfor %} </ul> {% endblock %}La estructura de mi base de datos contiene estos dos modelos: chat y comentario. Se supone que cada chat (sala) tiene sus propios comentarios. Usé 'models.ForeignKey' para poder filtrar los comentarios de cada chat (sala). En mi index.html enumero todos los chats y cada uno de ellos tiene un hipervínculo a la sección /comentarios/.
En mi views.py tengo esta línea: 'queryset = Comment.objects.filter(chat_id=1)' Chat_id es la columna en la tabla de comentarios sql y tal como está ahora solo mostrará los comentarios que pertenecen al chat con pk =1. ¿Cómo puedo acceder automáticamente al chat para las diferentes direcciones URL /comentarios/1/ /comentarios/2/ y así sucesivamente?
Espero que la explicación sea clara. Lo siento principiante aquí, puedo tratar de explicar más si no tiene mucho sentido.
Mejor, Fabián
Debe definir el método get_queryset en lugar del atributo queryset independiente.
def get_queryset(self, *args, **kwargs): return Comment.objects.filter(chat_id=self.kwargs['pk'])En lugar de CommentList , puede usar la vista simple:
def comments_index(request, chatid): return render(request, 'xxx/comment_list.html', { 'comments': Comment.objects.filter(chat_id=chatid) })Y en URL:
url(r'^comments/(?P<chatid>[0-9]+)/$', views.comments_index, name='comments'),