首页 > 解决方案 > Django:包含的模板不出现

问题描述

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

视图.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)

网址.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 %}

消息.html

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

标签: djangoajaxdjango-viewsdjango-templates

解决方案


我认为这是因为字典中没有messages用于context呈现crete_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

推荐阅读