предварительно заполненные поля не срабатывают при импорте в базу данных

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