Я продолжаю получать эту ошибку: (1366, "Неверное значение строки: '\\xF0\\x9F\\x8E\\xA5 W...' для столбца 'content' в строке 1")

Я создал модель Post в моем Django приложении, которая использует редактор разметки Martor для сбора содержимого постов в виде синтаксиса разметки и перевода/рендеринга их в шаблоне поста. Я продолжаю получать ошибку 1366, я уже просмотрел несколько решений здесь на stackoverflow, но, похоже, ничего не работает... Наиболее распространенным решением, которое я видел, является изменение таблицы содержимого для изменения набора символов на utf8mb4.

Когда я запустил код: ALTER TABLE myapp_post CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;

Я получаю ошибку: ERROR 1071 (42000): Specified key was too long; max key length is 3072 bytes

Единственный способ обойти это - ввести запрос: ALTER TABLE myapp_post CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin;

Которые работают, но я все еще получаю ту же ошибку.

Вот мои коды для приложения

# models.py
class Post(models.Model):
    id = models.AutoField(primary_key=True)

    title = models.CharField(max_length=180)
    title_slug = models.SlugField(max_length=900)
    date = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    content = MartorField()
    post_image = models.ImageField(upload_to='images/post_images/')

    objects = models.Manager()

    def get_absolute_url(self):
        return reverse('post', kwargs={'title_slug': self.title_slug})

    def __str__(self):
        return ' by '.join(map(str, [self.title, self.author.user.username]))

# forms.py
class PostForm(forms.ModelForm):

    class Meta:
        model = Post
        fields = (
            'title', 'content', 'post_image'
        )

# views.py
def create_post(request):
    if request.method == 'POST':
        form = PostForm(request.POST, request.FILES)

        if form.is_valid():
            cd = form.cleaned_data

            title, content, post_image= (
                cd['title'], cd['content'], cd['post_image']
            )

            Post.objects.create(
                title=title, title_slug='-'.join(title.lower().split(' ')),
                date=datetime.now(), author=Author.objects.get(user=request.user),
                content=content, post_image=post_image
            ).save()

            messages.success(request, f'Post "{title}" created successfully!')
            return HttpResponseRedirect(reverse('index'))
        else:
            messages.error(request, 'This form isn\'t valid!')
            return HttpResponseRedirect(reverse('create_post'))
    else:
        form = PostForm()

    return ___
-- DDL for myapp_database.myapp_post

CREATE TABLE `myapp_post` (
  `id` int NOT NULL AUTO_INCREMENT,
  `title` varchar(180) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `title_slug` varchar(900) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `date` datetime(6) NOT NULL,
  `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
  `post_image` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `author_id` int NOT NULL,

  CONSTRAINT `myapp_post_author_id_84b_fk_myapp_author_id` FOREIGN KEY (`author_id`) REFERENCES `myapp_author` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin

Форма работает без присутствия эмодзи в поле содержимого, что, как я понял, является причиной изменения набора символов в таблице SQL, но я намерен, чтобы содержимое содержало эмодзи. Поэтому я также буду признателен за обходные пути.

Надеюсь получить от кого-нибудь однозначное решение. Заранее спасибо 🙂

Вернуться на верх