I created a new mezzanine project with the following software versions:
    Linux 4.18.17-041817-generic (Ubuntu 18.04 with newer kernel)
    MariaDB 10.1.34 (running fine after explicitly creating the database 
with utf8 character encoding)
    Python 3.6.6
    Django 2.0.9 (from pypi)
    Mezzanine 4.3.1 (from github, along with filebrowser-safe)

The only modifications I've made are changing the timezone in settings.py 
and changing the database dictionary in local_settings.py.

Everything seemed to work. 'python manage.py createdb' was successful, then 
'python manage.py runserver 127.0.0.1:8000' was also successful.

I logged into the admin interface, navigated to add a new richtext page, 
filled in the title and body, and clicked save. A debug-friendly error page 
was then returned, and the following text was in the console.

    [12/Nov/2018 14:28:08] "POST /admin/admin_keywords_submit/ HTTP/1.1" 
200 1
    Internal Server Error: /admin/pages/richtextpage/add/
    Traceback (most recent call last):
      File 
"/home/mike/projects/plab/venv/lib/python3.6/site-packages/django/core/handlers/exception.py",
 
line 35, in inner
        response = get_response(request)
      File 
"/home/mike/projects/plab/venv/lib/python3.6/site-packages/django/core/handlers/base.py",
 
line 128, in _get_response
        response = self.process_exception_by_middleware(e, request)
      File 
"/home/mike/projects/plab/venv/lib/python3.6/site-packages/django/core/handlers/base.py",
 
line 126, in _get_response
        response = wrapped_callback(request, *callback_args, 
**callback_kwargs)
      File 
"/home/mike/projects/plab/venv/lib/python3.6/site-packages/django/contrib/admin/options.py",
 
line 575, in wrapper
        return self.admin_site.admin_view(view)(*args, **kwargs)
      File 
"/home/mike/projects/plab/venv/lib/python3.6/site-packages/django/utils/decorators.py",
 
line 142, in _wrapped_view
        response = view_func(request, *args, **kwargs)
      File 
"/home/mike/projects/plab/venv/lib/python3.6/site-packages/django/views/decorators/cache.py",
 
line 44, in _wrapped_view_func
        response = view_func(request, *args, **kwargs)
      File 
"/home/mike/projects/plab/venv/lib/python3.6/site-packages/django/contrib/admin/sites.py",
 
line 223, in inner
        return view(request, *args, **kwargs)
      File 
"/home/mike/projects/plab/venv/lib/python3.6/site-packages/mezzanine/pages/admin.py",
 
line 66, in add_view
        return super(PageAdmin, self).add_view(request, **kwargs)
      File 
"/home/mike/projects/plab/venv/lib/python3.6/site-packages/django/contrib/admin/options.py",
 
line 1554, in add_view
        return self.changeform_view(request, None, form_url, extra_context)
      File 
"/home/mike/projects/plab/venv/lib/python3.6/site-packages/django/utils/decorators.py",
 
line 62, in _wrapper
        return bound_func(*args, **kwargs)
      File 
"/home/mike/projects/plab/venv/lib/python3.6/site-packages/django/utils/decorators.py",
 
line 142, in _wrapped_view
        response = view_func(request, *args, **kwargs)
      File 
"/home/mike/projects/plab/venv/lib/python3.6/site-packages/django/utils/decorators.py",
 
line 58, in bound_func
        return func.__get__(self, type(self))(*args2, **kwargs2)
      File 
"/home/mike/projects/plab/venv/lib/python3.6/site-packages/django/contrib/admin/options.py",
 
line 1451, in changeform_view
        return self._changeform_view(request, object_id, form_url, 
extra_context)
      File 
"/home/mike/projects/plab/venv/lib/python3.6/site-packages/django/contrib/admin/options.py",
 
line 1492, in _changeform_view
        self.save_related(request, form, formsets, not add)
      File 
"/home/mike/projects/plab/venv/lib/python3.6/site-packages/django/contrib/admin/options.py",
 
line 1049, in save_related
        form.save_m2m()
      File 
"/home/mike/projects/plab/venv/lib/python3.6/site-packages/django/forms/models.py",
 
line 439, in _save_m2m
        f.save_form_data(self.instance, cleaned_data[f.name])
      File 
"/home/mike/projects/plab/venv/lib/python3.6/site-packages/mezzanine/generic/fields.py",
 
line 206, in save_form_data
        super(KeywordsField, self).save_form_data(instance, data)
      File 
"/home/mike/projects/plab/venv/lib/python3.6/site-packages/django/db/models/fields/__init__.py",
 
line 838, in save_form_data
        setattr(instance, self.name, data)
      File 
"/home/mike/projects/plab/venv/lib/python3.6/site-packages/django/db/models/fields/related_descriptors.py",
 
line 509, in __set__
        % self._get_set_deprecation_msg_params(),
    TypeError: Direct assignment to the reverse side of a related set is 
prohibited. Use +.set() instead.
    [12/Nov/2018 14:28:08] "POST /admin/pages/richtextpage/add/ HTTP/1.1" 
500 146350

Attempting to debug this in pycharm, I found that the item being saved was 
a 'keyword' of ''. I had not entered any keywords in the form, so it 
appears the empty string is saved, anyway. I've read through both django 
and mezzanine code in the callstack, and it seems like this is related to 
django's database layer and ManyToMany relationships. But it seems the 
ultimate saving of the empty keyword is a Field.setattr() call, which is 
neither an = or a .set(). And I don't know what the '+' character is from.

Can anyone help me to understand what needs to be fixed, here? Since I 
haven't actually written any code, I'm tempted to think either mezzanine or 
django needs a pull request. Or perhaps there's a compatibility issue 
between versions of django and mezzanine? I haven't seen anything obvious 
in git diffs. But until I understand better, I wouldn't know how to go 
about fixing it. I have found a few slightly similar things in this group 
and on stackexchange, but nothing that matches. The same behavior occurs if 
I run the server and try to add a blog post rather than a richtextpage. And 
I get the same behavior on a different server running debian 8 rather than 
ubuntu 18.

Thanks for any advice!

-- 
You received this message because you are subscribed to the Google Groups 
"Mezzanine Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to