#python #django #django-models
Вопрос:
Я использую prepopulated_fields prepopulated_fields = {'slug': ('name', 'mark_steel')}
, и он работает в панели администратора при установке вручную. Но это не работает при массовой записи в базу данных.
Есть ли какое-нибудь решение, чтобы исправить это?
Комментарии:
1. Что вы подразумеваете под тем, что это не работает при массовом написании ? Вы имеете в виду, когда вы создаете объект модели вне панели администратора?
2. да, это правильно
Ответ №1:
Если я правильно понял ваш вопрос… Вы можете переопределить метод сохранения в модели и добавить некоторую логику для автоматического создания слага из полей name и mark_down, не создавая его вручную.
from django.db import models
from django.template.defaultfilters import slugify
Class TestModel(models.Model):
name = models.CharField()
mark_steel = models.CharField()
slug = models.SlugField()
def save(self, *args, **kwargs):
if self.name and self.mark_steel: # If both have a value, create a slug from both fields
self.slug = '-'.join((slugify(self.name), slugify(self.mark_steel)))
elif self.name: # If name alone have a value, create a slug from name field
self.slug = slugify(self.name)
elif self.mark_steel: # If mark_steel alone have a value, create a slug from mark_steel
self.slug = slugify(self.mark_steel)
super(Post, self).save(*args, **kwargs)
Комментарии:
1. Большое вам спасибо, ваше решение очень хорошее. Но, к сожалению, slugify не понимает русских иероглифов и усекает их.
2. О. Но я рад, что вы нашли решение, которое я видел ниже, которое заставило его работать с slugify. 🙂
Ответ №2:
Следующее решение помогло мне:
создать utils.py
cyrillic_letters = {
u'а': u'a',
u'б': u'b',
u'в': u'v',
u'г': u'g',
u'д': u'd',
u'е': u'e',
u'ё': u'e',
u'ж': u'zh',
u'з': u'z',
u'и': u'i',
u'й': u'y',
u'к': u'k',
u'л': u'l',
u'м': u'm',
u'н': u'n',
u'о': u'o',
u'п': u'p',
u'р': u'r',
u'с': u's',
u'т': u't',
u'у': u'u',
u'ф': u'f',
u'х': u'h',
u'ц': u'ts',
u'ч': u'ch',
u'ш': u'sh',
u'щ': u'sch',
u'ъ': u'',
u'ы': u'y',
u'ь': u'',
u'э': u'e',
u'ю': u'yu',
u'я': u'ya'
}
def from_cyrillic_to_eng(text: str):
text = text.replace(' ', '_').lower()
tmp = ''
for ch in text:
tmp = cyrillic_letters.get(ch, ch)
return tmp
models.py
from shop.utils import from_cyrillic_to_eng
class Product(models.Model):
name = models.CharField(max_length=200, db_index=True, verbose_name='Наименование')
slug = models.SlugField(max_length=200, db_index=True, verbose_name='URL')
mark_steel = models.CharField(max_length=10, verbose_name='Марка стали')
def save(self, *args, **kwargs):
if not self.slug:
self.slug = from_cyrillic_to_eng(str(self.name) '_' str(self.mark_steel))
super(Product, self).save(*args, **kwargs)