【问题标题】:Django not rendering viewDjango不渲染视图
【发布时间】: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


【解决方案1】:

正如 Daniel Roseman 在 cmets 中所说“这里的问题是您没有终止收件箱 URL 的正则表达式,因此它也与对话 URL 匹配。”所以我在 @ 末尾添加了所需的 $ 987654322@ url 模式并修复了它!

【讨论】:

    猜你喜欢
    • 2018-12-13
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 2013-05-01
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    相关资源
    最近更新 更多