Django: как переопределить verbose_name и help_text модельных полей

  1. Кодовый блок называется «замыкающим замыканием». Когда функция или метод принимает замыкание в качестве последнего аргумента, вы можете поместить замыкание после закрытия круглой скобки вызова функции / метода. Заключительное закрытие позволяет писать функции, которые больше похожи на встроенные структуры управления, и позволяет избежать вставки скобок внутри круглых скобок.
  2. Например, UIView определяет метод класса с этой сигнатурой :

    class func animateWithDuration(duration: NSTimeInterval, animations: () -> Void)
    

    Итак, вы можете называть это следующим образом:

    UIView.animateWithDuration(0.2, animations: {
        self.view.alpha = 0
    })
    

    или вы можете вызвать его с закрывающим замыканием, например:

    UIView.animateWithDuration(0.2) {
        self.view.alpha = 0
    }
    

    Обратите внимание, что с завершающим замыканием вы полностью опускаете ключевое слово (animations:) последнего аргумента.

    Вы можете использовать только закрывающее закрытие для самого последнего аргумента функции. Например, если вы используете UIView.animateWithDuration(animations:completion:), вы должны поместить блок animations: в круглые скобки, но вы можете использовать трейлинг-закрытие для блока completion:.

    1. (result, error) part объявляет имена аргументов блоку. Я выхожу, что метод update имеет подписи примерно так:
      func update(completedItem: NSMutableDictionary,
          completion: (NSData!, NSError!) -> Void)
      

    Таким образом, он вызывает блок завершения с двумя аргументами. Для доступа к этим аргументам блок дает им имена result и error. Вам не нужно указывать типы аргументов, потому что компилятор может выводить типы на основе декларации update.

    Обратите внимание, что вы фактически можете опустить имена аргументов и использовать сокращенные имена $0 и $1:

    self.table!.update(completedItem) {
        UIApplication.sharedApplication().networkActivityIndicatorVisible = false
        if $1 != nil {
            println("Error: " + $1.description)
            return
        }
    
        self.records.removeAtIndex(indexPath.row)
        self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
    }
    

    Вы можете узнать больше о замыканиях, прочитав «Закрытие» на языке Swift .

1
задан Matt 5 March 2019 в 09:08
поделиться

1 ответ

Я создал миксины для этого сейчас и

class ChangeFieldNamesMixin(models.Model):

def __init__(self, *args, **kwargs):
    model_fields = self._meta.get_fields()
    initialise_texts(self._meta.model_name, model_fields)
    super(ChangeFieldNamesMixin, self).__init__(*args, **kwargs)

class Meta:
    abstract = Trueenter code here

def initialise_texts(name, model_fields):
model_field_name = name + 'Field'
Model = apps.get_model("custom", model_field_name)
field_names_to_create = []
field_dict = compose_field_dict(name, Model)

# create entries in table if empty
if len(field_dict) == 0:
    for entry in model_fields:
        if entry.editable:
            attrs = {'name': entry.name, 'help_text': entry.help_text, 'label': entry.verbose_name}
            new_entry = Model(**attrs)
            field_names_to_create.append(new_entry)

            print('Saving {}'.format(new_entry))
    field_list = Model.objects.bulk_create(field_names_to_create)
    compose_field_dict(name, Model, field_list)
else:

    for entry in model_fields:
        if entry.editable:
            key = entry.name

            if key in field_dict.keys():
                setattr(entry, 'verbose_name', field_dict[key].label)
                setattr(entry, 'help_text', field_dict[key].help_text)

Я не слишком рад этому решению, потому что я думаю, что должен быть лучший способ инициализировать поля в базе данных. Я довольно новичок в разработке django и python (более опытный в Java), поэтому некоторые отзывы будут оценены.

0
ответ дан Matt 5 March 2019 в 09:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: