我有一个 Django 应用程序,有两种类型的用户,我们称它们为 A 和 B。这两种用户类型有不同的导航栏。用户类型 A 在其导航栏中有一个链接,允许他们发送消息。发送消息表单出现在叠加层中,因此表单需要出现在每个模板中,或者通过 AJAX 获取。这些用户可以从网站上的任何/每个页面发送消息,并且每个页面都有自己的视图。如果消息有错误,用户应该返回到他们所在的同一页面,并且错误应该显示在表单叠加层中。如果发送成功,他们应该被重定向到显示他们消息的新页面。
目前,我已将表单放入一个单独的模板中,该模板包含在用户类型 A 的所有页面中。我将表单操作指定为名为 send_message 的视图,并告诉该视图呈现到此模板。视图永远不会被调用,所以我想这不是正确的方法。
如何在每个模板中呈现此表单?我需要从每个视图调用一个函数,还是使用一个特殊的模板标签(我查看了包含标签,但我认为它们不适合这种情况)?或者我应该使用 AJAX 获取表单吗?我是否将表单视图添加到每个 URL?
编辑:添加一些代码来解释。
比如说,我在一个页面上有一个简单的视图,如下所示:
@login_required
def index_view(request, place_id):
categories = Category.objects.all()
return render(request, 'places/categories.html', {'place_id': place_id, 'categories': categories})
此页面的模板是从其中包含导航栏的模板扩展而来的,该模板包括发送消息表单,如下所示:
<div id="message-popup">
<h1>NewMessage</h1>
<form action="{% url "send_message" %}" method="post">
{% csrf_token %}
{% get_message_form as message_form %}
<table>
<tr>
<td>{{ message_form.recipient.label_tag }}{{ message_form.recipient }}</span></td>
<td>{{ message_form.title.label_tag }}{{ message_form.title }}</td>
</tr>
<tr>
<td>{{ message_form.categories.label_tag }}{{ message_form.categories }}</td>
<td>
{{ message_form.content.label_tag }}{{ message_form.content }}
<button type="submit" class="button">Send</button>
<button class="box-close button">Cancel</button>
</td>
</tr>
</table>
</form>
</div>
该表单发布到此视图:
def send_message_view(request, place_id):
place = Place.objects.get(id=place_id)
if request.POST:
user = get_user_class(request.user)
message_form = forms.SendMessageForm(request.POST, place=place, user=user)
if message_form.is_valid():
message_form.save()
# redirect to page showing the message
else:
message_form = forms.SendMessageForm(place=place, user=user)
return render(request, 'messaging/send_message_form.html', {'message_form': message_form})
我缺少的步骤是如何让表单首先呈现。当我转到类别页面时,表单不存在 - 显然是因为上下文中没有 message_form 变量。那么我可以让我的 send_message_view 和我的 index_view 运行和呈现这两个模板,还是有其他方法我必须将它们链接在一起?
编辑:
好的,这是我的模板标签:
@register.inclusion_tag('messaging/send_message_form.html', name='get_message_form', takes_context=True)
def get_message_form(context, place, sender, recipient):
message_form = SendMessageForm(context['request'].POST or None, place=place, sender=sender, recipient=recipient)
url = None
if context['request'].method=='POST' and message_form.is_valid():
message = message_form.save()
url = reverse('conversation', kwargs={'place_slug': place.slug, 'message_id': message.id})
""" This doesn't work
return HttpResponseRedirect(url) """
return {'message_form': message_form, 'place_id': place.id, 'message_sent_url': url}
我不能从模板标签做一个 HttpResponseRedirect,所以我需要找到一些其他的方法来重定向到成功页面。我可以将重定向 URL 发送到模板,但我不知道从那里可以用它做什么......