Смайлики в форме сохраняются как ???? в базе данных - PullRequest
0 голосов
/ 29 июня 2018

В моем приложении Django и базе данных MariaDB, когда пользователи публикуют форму, содержащую смайлики типа ?, смайлик сохраняется как ????, что явно не предназначено.

Функция в представлениях:

# -*- 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()

Модель, которая используется для создания формы:

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)

Форма:

class SendLetterForm(forms.ModelForm):    
           class Meta():
        model = SendLetter
        exclude = ('author','created', 'published')

Сортировка таблицы установлена ​​на utf8mb4_bin, текст на персидском языке. Я также безуспешно пробовал другие сопоставления utf8, например utf8_persian_cli. У меня нет проблем с сохранением персидского текста без смайликов.

Когда я вставляю текст, содержащий смайлики, прямо в поле таблицы, используя PhpMyAdmin, смайлики сохраняются правильно.

Я также пробовал d.body = form ['body'] (без cleaned_data), но получил тот же ???? после сохранения.

Итак, вопрос в том, как правильно сохранить смайлики, не ставя под угрозу безопасность формы?

1 Ответ

0 голосов
/ 29 июня 2018

Благодаря этому ответу добавлению

'OPTIONS': {'charset': 'utf8mb4'},

до параметров settings.py DATABASE и установка параметров сопоставления полей на utf8mb4 решила проблему.

...