【发布时间】:2020-04-02 18:27:15
【问题描述】:
我正在制作一个消息系统,它有一个消息模型和一些视图,用于收件箱和对话等内容。
收件箱视图和模板有效,并通过发件人的 ID 链接到对话。但是,当我单击发件人姓名时(发件人姓名是链接(模板链接为<a href="{% url 'conversation' sender.id %}">{{ sender }}</a>),该链接旨在触发应该呈现模板 convo.html 的对话视图(项目级 url 是url(r'^messaging/inbox/conversation/(?P<id>[\w-]+)/$', message_views.Conversation.as_view(), name="conversation"),) ),Django 更改了 url 但停留在同一页面上(因此它触发收件箱视图并停留在 inbox.html 并更改 url 但不触发对话视图并且不呈现 convo.html模板)。我尝试从基于函数的视图更改为基于类的视图,但它什么也没做。我做错了什么?
注意:我还是 django 的新手,所以请原谅我的任何不良做法;我正在尝试自学。
views.py(收件箱和对话视图)
def inbox(request):
messages = Message.objects.filter(receiver=request.user.id)
senders = {}
for message in messages:
if message.sender not in senders:
senders[message.sender] = message
return render(request, 'inbox.html', {'senders': senders})
# There is only ever one of this view, either the CBV or FBV
def conversation(request, other_user_id):
print(request.method)
if request.method == "POST":
reply = request.post['reply']
other_user = CustomUser.objects.get(id=other_user_id)
message = Message(sender=request.user, receiver=other_user)
message.save()
return redirect("conversation")
else:
other_user = CustomUser.objects.get(id=other_user_id)
messages = Message.objects.filter(Q(receiver=request.user) & Q(sender=other_user))
print(messages)
return render(request, 'convo.html', {'messages': messages})
# Class based conversation view
class Conversation(View):
def post(request, other_user_id):
reply = request.post['reply']
other_user = CustomUser.objects.get(id=other_user_id)
message = Message(sender=request.user, receiver=other_user)
message.save()
return redirect("conversation")
def get(request, other_user_id):
other_user = CustomUser.objects.get(id=other_user_id)
messages = Message.objects.filter(Q(receiver=request.user) & Q(sender=other_user))
print(messages)
return render(request, 'convo.html', {'messages': messages})
模板 - inbox.html
<!DOCTYPE html>
{% extends "accbase.html" %}
<!--Omitted outbox in favor of conversation-->
{% block content %}
<div class="inbox">
<h1>Inbox</h1>
<hr>
{% for sender in senders %}
<a href="{% url 'conversation' sender.id %}">{{ sender }}</a>
<br>
{{sender.message.created_at}}
<br>
{% endfor %}
</div>
{% endblock %}
模板 - convo.html
<!DOCTYPE html>
<!--Template for reciever side of conversation-->
{% extends "accbase.html"%}
{% block content %}
<div class="conversation">
<h1>Conversation with {{sender}}</h1>
<p>
{% for msg in messages %}
<!--Order is descending ~~ bottom to top: newest to oldest-->
{{ msg.content }}
<br>
{% endfor %}
<hr>
<form method="POST">
<label>Reply</label>
<input type="text" name="reply">
</form>
</p>
<button type="submit">Send</button>
</div>
{% endblock %}
项目级 urls.py
from django.urls import path, re_path, include
from django.conf.urls import url
from messaging import views as message_views
urlpatterns = [
url(r'^messaging/inbox', message_views.inbox, name="inbox"),
url(r'^messaging/inbox/conversation/(?P<id>[\w-]+)/$', message_views.Conversation.as_view(), name="conversation"),
]
【问题讨论】:
-
您需要更具体地解释事情。 “当我点击发件人姓名时”那是什么?究竟是哪个链接(url)?哪个网址模式?您希望触发哪个视图?您希望渲染哪个模板?请使用您在代码中显示的实际视图名称、文件名、模板名称,这样我们就不必阅读所有代码(看起来很多,而不是最小的示例)和猜测。跟我们谈谈。
-
我编辑了它,如果信息还不够,请告诉我。我包含了收件箱视图和模板,因为我从那里重定向,与收件箱 url 模式相同。我还包括对话基于类的视图和基于函数的视图,以准确显示我做了什么,以防万一我做错了什么
-
我不明白你的网址格式。您有两个名为收件箱的模式和两个名为对话的模式。在应用程序 url 中,它们也具有相同的 url。这是错误的。
-
最初我什至没有那些应用级别的 url,不管有没有它们都没有区别。我正在自学,还需要进一步了解网址,请见谅。
-
好吧,看起来应用程序 url 没有被使用,因为您没有将它们包含在项目 url 的任何地方。所以可能不会在这里引起问题。您在控制台中看到了什么?您是否看到 /messaging/inbox/conversation/24/ 的 GET 请求?在您的
conversation视图中,您有打印命令,您看到打印“GET”了吗?
标签: django django-templates django-views