Uchiha AJ
Uchiha AJ

Reputation: 157

Django-postman not working

I tried to implement Django-postman for the user to user messaging system.

I cloned the repo and did this in my settings.py and URLs.py file too:

In URLs.py of main file i have included :

 re_path(r'^messages/', include('postman.urls', namespace='postman')),

In Settings.py file I have included:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'postman',
    'account',
    'landingpage',
]

POSTMAN_I18N_URLS = True  # default is False
POSTMAN_DISALLOW_ANONYMOUS = True  # default is False
POSTMAN_DISALLOW_MULTIRECIPIENTS = True  # default is False
POSTMAN_DISALLOW_COPIES_ON_REPLY = True  # default is False
POSTMAN_DISABLE_USER_EMAILING = True  # default is False
POSTMAN_FROM_EMAIL = '[email protected]'  # default is DEFAULT_FROM_EMAIL
#POSTMAN_PARAMS_EMAIL = get_params_email  # default is None
POSTMAN_AUTO_MODERATE_AS = True  # default is None
POSTMAN_SHOW_USER_AS = 'get_full_name'  # default is None
POSTMAN_NAME_USER_AS = 'last_name'  # default is None
POSTMAN_QUICKREPLY_QUOTE_BODY = True  # default is False
POSTMAN_NOTIFIER_APP = None  # default is 'notification'
POSTMAN_MAILER_APP = None  # default is 'mailer'

URLs of postman:

urlpatterns = [
        # Translators: keep consistency of the <option> parameter with the translation for 'm'
        url(pgettext_lazy('postman_url', r'^inbox/(?:(?P<option>m)/)?$'), InboxView.as_view(), name='inbox'),
        # Translators: keep consistency of the <option> parameter with the translation for 'm'
        url(pgettext_lazy('postman_url', r'^sent/(?:(?P<option>m)/)?$'), SentView.as_view(), name='sent'),
        # Translators: keep consistency of the <option> parameter with the translation for 'm'
        url(pgettext_lazy('postman_url', r'^archives/(?:(?P<option>m)/)?$'), ArchivesView.as_view(), name='archives'),
        # Translators: keep consistency of the <option> parameter with the translation for 'm'
        url(pgettext_lazy('postman_url', r'^trash/(?:(?P<option>m)/)?$'), TrashView.as_view(), name='trash'),
        url(pgettext_lazy('postman_url', r'^write/(?:(?P<recipients>[^/#]+)/)?$'), WriteView.as_view(), name='write'),
        url(pgettext_lazy('postman_url', r'^reply/(?P<message_id>[\d]+)/$'), ReplyView.as_view(), name='reply'),
        url(pgettext_lazy('postman_url', r'^view/(?P<message_id>[\d]+)/$'), MessageView.as_view(), name='view'),
        # Translators: 't' stands for 'thread'
        url(pgettext_lazy('postman_url', r'^view/t/(?P<thread_id>[\d]+)/$'), ConversationView.as_view(), name='view_conversation'),
        url(pgettext_lazy('postman_url', r'^archive/$'), ArchiveView.as_view(), name='archive'),
        url(pgettext_lazy('postman_url', r'^delete/$'), DeleteView.as_view(), name='delete'),
        url(pgettext_lazy('postman_url', r'^undelete/$'), UndeleteView.as_view(), name='undelete'),
        url(pgettext_lazy('postman_url', r'^mark-read/$'), MarkReadView.as_view(), name='mark-read'),
        url(pgettext_lazy('postman_url', r'^mark-unread/$'), MarkUnreadView.as_view(), name='mark-unread'),
        url(r'^$', RedirectView.as_view(url=reverse_lazy('postman:inbox'), permanent=True)),
    ]

Write.html

{% extends "postman/base_write.html" %}
{% load i18n %}
{% block pm_write_title %}{% trans "Write"%}{% endblock %}

base_write.html

{% extends "postman/base.html" %}
{% load i18n static %}
{% block extrahead %}{{ block.super }}
{% if autocompleter_app.is_active %}{# using the available admin jQuery is enough #}
{# should not be necessary since AS v1.3 with AJAX_SELECT_BOOTSTRAP set #}
{#<script type="text/javascript" src="{% static 'admin/js/jquery.min.js' %}"></script>#}
{% endif %}
{{ form.media }}{# for ajax_selects (v1.3.6 at least) #}
{% endblock %}
{% block content %}
<div id="postman">
<h1>{% block pm_write_title %}{% endblock %}</h1>
<form action="{% if next_url %}?next={{ next_url|urlencode }}{% endif %}" method="post">{% csrf_token %}
<table>
{% block pm_write_recipient %}{% endblock %}
{{ form.as_table }}
</table>
<button type="submit" class="pm_btn pm_btn-send">{% trans "Send" %}</button>
</form>
</div>
{% endblock %}

Base.html

{% extends "base.html" %}{# not myself but a site-level one (TEMPLATE_DIRS setting) #}
{% load i18n static %}{% load postman_tags %}
{% block title %}{% trans "Messaging" %}{% endblock %}
{% block extrahead %}{{ block.super }}
<link type="text/css" media="all" rel="stylesheet" href="{% static 'postman/css/postman.css' %}" />
{% endblock %}
{% block postman_menu %}
<ul id="postman_menu">{% postman_unread as unread_count %}
 <li><a href="{% url 'postman:inbox' %}">&raquo;&nbsp;{% trans "Inbox" %}{% if unread_count %} <strong>({{ unread_count }})</strong>{% endif %}</a></li>
 <li><a href="{% url 'postman:sent' %}">&raquo;&nbsp;{% trans "Sent Messages" %}</a></li>
 <li><a href="{% url 'postman:write' %}">&raquo;&nbsp;{% trans "Write" %}</a></li>
 <li><a href="{% url 'postman:archives' %}">&raquo;&nbsp;{% trans "Archives" %}</a></li>
 <li><a href="{% url 'postman:trash' %}">&raquo;&nbsp;{% trans "Trash" %}</a></li>
</ul>
{% endblock %}

The problem is that whenever I run 127.0.0.1:8000/messages/write in my browser, the website is blank. The django admin shows messaging boxes but the url returns blank. What am i doing wrong here. Thanks

Upvotes: 3

Views: 826

Answers (3)

Simon J
Simon J

Reputation: 21

Second the answer from @Amiay Narayan, with some modifications on the base.html file part.

The latest base.html from the Django-postman is:

{% extends "base.html" %}{# not myself but a site-level one (TEMPLATE_DIRS setting) #}

So in the base.html of your own Django project, the only thing that needs to be added somewhere between the <body>.....</body> is Django-postman's simple menu:

    {% block postman_menu %}
    {% endblock %}

Upvotes: 0

Amiay Narayan
Amiay Narayan

Reputation: 529

Below are the steps that will get you started with bare-minimum:

  1. On the root directory (directory with manage.py) python3 -m pip install django-postman

  2. In settings.py :

INSTALLED_APPS = [ 
    ...,
    # 'pagination'  # has to be before postman
    # ...
    'postman',
    # ...
    # 'ajax_select'
    # 'notification'
    # 'mailer'
]
    
TEMPLATES = [
    {
        '...,
        'DIRS': [BASE_DIR/ 'templates'],
        ...
    },
]
  1. On the root directory execute the following command: python manage.py migrate

    mkdir -p templates/postman

touch templates/postman/base.html

Now you should be able to see the Messages and Pending on the admin page of your site.

  1. Add the following markup to the base.html file we created in the above step:
<!doctype html>

<html>
    <head>
        <title>
            {% block title %}
            {% endblock %}
        </title>
        {% block extrahead %}
        {% endblock %}
    </head>
    <body>
        {% block content %}
        {% endblock %}
        
        {% block postman_menu %}
        {% endblock %}
    </body>
</html>

This is because the package expects this template to be able to render the urls. 5. Add this path path to the project's urlpatterns:

path('messages/', include('postman.urls'), name='postman'),
  1. Now you can use any of the urls on the actual site

    localhost:8000/messages/write

There is one catch, by default the messages that you send will be pending so either you have to approve from the admin site ( by moderator) manually or you can set the POSTMAN_AUTO_MODERATE_AS=True in the settings.py.

Most of the above have been mentioned in django-postman documentation, but it was very challenging for me as a beginner to grasp these, So I have tried to simplify the steps, Hope it helps someone :)

Upvotes: 3

43Tesseracts
43Tesseracts

Reputation: 4937

Did you include the required template blocks in YOUR base.html template that the postman/base.html is extending?

From: https://bitbucket.org/psam/django-postman/wiki/quickstart#rst-header-templates

The postman/base.html template extends a base.html site template, in which some blocks are expected:
•title: in <html><head><title>, at least for a part of the entire title string
•extrahead: in <html><head>, to put some <script> and <link> elements
•content: in <html><body>, to put the page contents
•postman_menu: in <html><body>, to put a navigation menu

Upvotes: 0

Related Questions