【问题标题】:Django: Included template does not appearDjango:包含的模板不出现
【发布时间】:2021-01-31 18:46:30
【问题描述】:

我正在使用 ajax 实现消息系统。当我发布新消息时一切正常。我的意思是,新消息出现而不重新加载,但是当我转到“create_message”页面时,我看不到包含的模板(messages.html),它在发布消息后包含。我尝试包含其他模板并且它有效。我的代码如下,提前感谢您的帮助。

views.py

class MessageCreateView(CreateView):
    model = Message
    fields = ['content']
    template_name = 'users/create_message.html'
    
    def post(self, request, *args, **kwargs):
        form = self.get_form()
        if form.is_valid():
            if request.method == 'POST':
                sender = self.request.user.profile
                receiver_pk = self.kwargs['profile_pk']
                print(receiver_pk)
                receiver = Profile.objects.get(id=receiver_pk)
                new_message = Message.objects.create(
                    message_by=sender,
                    message_to=receiver,
                    content = form.cleaned_data['content'])
                return JsonResponse({'message': model_to_dict(new_message)}, status=200)
        else:
            return self.form_invalid(form)

    def get_context_data(self, **kwargs):
        context = super(MessageCreateView, self).get_context_data(**kwargs)
        context['profile_pk'] = self.kwargs['profile_pk']
        return context

def messages(request, profile_pk):
    current_user_profile = request.user.profile
    second_profile = Profile.objects.get(pk=profile_pk)
    messages = Message.objects.filter(
        Q(message_to=current_user_profile, message_by=second_profile)|
        Q(message_to=second_profile, message_by=current_user_profile)).order_by('date_of_create')
    context = {
        'messages': messages
    }
    return render(request, 'users/messages.html', context=context)

urls.py

urlpatterns = [
    path('login/', CustomLoginView.as_view(template_name='users/login.html'), name='login'),
    path('logout/', LogoutView.as_view(template_name='users/logout.html'), name='logout'),
    path('register/', register, name='register'),
    path('profile/<int:pk>/', ProfileDetailView.as_view(), name='profile_detail'),
    path('profile/follow/<int:pk>', follow_profile, name='follow_profile'),
    path('results/', search, name='search'),
    path('create_message/<int:profile_pk>/', MessageCreateView.as_view(), name='create_message'),
    path('messages/<int:profile_pk>/', messages, name='messages')
]

create_message.html

{% extends 'users/base.html' %}
{% load crispy_forms_tags %}

{% block title %}Chat{% endblock %}

{% block content %}
    <div class="messages">
        {% include 'users/messages.html' %}
    </div>

    <form action="" method="POST" class="messageForm" data-url="{% url 'create_message' profile_pk %}">
        {% csrf_token %}
        {{ form|crispy }}
        <button type="button" class="messageBtn">Send</button>
    </form>
{% endblock %}

messages.html

{% for message in messages %}
    <h6>{{ message.content }}</h6>
    <small>{{ message.message_by }} / {{ message.date_of_create }}</small>
{% endfor %}

【问题讨论】:

  • console.log(data) 给了什么?
  • 其实我没必要展示js文件,我觉得没关系。问题是当我转到“create_message”时,messages.html 不包括在内。
  • 如果您确定不需要它,那么您最好不要包含这些东西并保持简单。 :)
  • 那么,您的create_message.html 没有被渲染?或者它被渲染了,但只有messages.html里面的create_message.html不是?
  • Messages.html 未在 create_message.html 中呈现

标签: django ajax django-views django-templates


【解决方案1】:

我认为这是因为context 字典中没有用于呈现crete_messages 页面的messages。我只是从messages 视图中复制和粘贴代码,在下面草率地做到了这一点,但你可能想重构它。

    def post(self, request, *args, **kwargs):
        form = self.get_form()
        if form.is_valid():
            if request.method == 'POST':
                sender = self.request.user.profile
                receiver_pk = self.kwargs['profile_pk']
                print(receiver_pk)
                receiver = Profile.objects.get(id=receiver_pk)
                new_message = Message.objects.create(
                    message_by=sender,
                    message_to=receiver,
                    content = form.cleaned_data['content'])
                return JsonResponse({'message': model_to_dict(new_message)}, status=200)
        else:
            return self.form_invalid(form)

    def get_context_data(self, **kwargs):
        context = super(MessageCreateView, self).get_context_data(**kwargs)
        profile_pk = context['profile_pk'] = self.kwargs['profile_pk']
        current_user_profile = self.request.user.profile
        second_profile = Profile.objects.get(pk=profile_pk)
        messages = Message.objects.filter(
            Q(message_to=current_user_profile, message_by=second_profile)|
            Q(message_to=second_profile, message_by=current_user_profile)).order_by('date_of_create')
        context['messages'] = messages
        return context

【讨论】:

  • 我尝试在messages.html 中添加任何内容,但没有显示
  • 对不起,我不关注 - 我将按照问题中发布的内容进行操作。如果您能更新您的问题,我或许可以提供帮助。
  • 很抱歉,我没有尝试在模板中添加任何内容。我再次检查它,测试文本出现在 create_message.html 中,结果表明您是对的。我不知道必须那样做。非常感谢!
猜你喜欢
  • 2013-04-26
  • 2012-03-16
  • 1970-01-01
  • 2017-12-04
  • 2017-10-01
  • 1970-01-01
  • 2020-10-29
  • 2014-08-27
  • 2019-02-28
相关资源
最近更新 更多