In my Django app and MariaDB database, when users post form containing smilies like  the smiley is saved as ???? which is clearly not intended.
The function in the views:
# -*- coding: utf-8 -*-
def send_letter(request):
    args = {}
    if request.method == 'POST':
        form = SendLetterForm(request.POST)
        if form.is_valid():           
            d = form.save(commit = False)
            try:
                author =  get_user(request)
            except:
                author = 'Guest'
            d.title = form.cleaned_data['title'] 
            d.body = form.cleaned_data['body'] 
            d.published = False
            d.save()
The model which is used to generates form is:
class SendLetter(models.Model):
    author = models.ForeignKey(User, blank=True, null=True)
    title = models.CharField(max_length=100, blank=False)
    body = models.TextField(blank=False)
    created = models.DateTimeField(default=datetime.datetime.now)
    published = models.BooleanField(default= False, blank=True)
The form:
class SendLetterForm(forms.ModelForm):    
           class Meta():
        model = SendLetter
        exclude = ('author','created', 'published')
The table collation is set to utf8mb4_bin and the text is in Persian. I have also tried other utf8 collations like utf8_persian_cli without success. I have no issues saving Persian text without smilies. 
When I insert text containing smilies directly into the table field, using PhpMyAdmin, the smilies are stored correctly.
I have also tried  d.body=form['body'] (without cleaned_data) but got the same ???? after save. 
So the question is how can I save smilies correctly without compromising the form security?
 
    