Обновление поля «Только чтение» в модели администратора - PullRequest
0 голосов
/ 08 декабря 2011

У меня есть модель сделки, которая содержит два поля даты.Первый - start_date, а второй - end_date.Моя цель заключается в том, чтобы при сохранении сделки я хотел обновить поле только для чтения, которое показывает вычитание этих двух полей date_.

Я пытаюсь написать виджет, однако могу получить только одно из полей.Вот мой виджет:

class DueToWidget(AdminDateWidget):                                                                                                                                                                        
    def render(self,name,value,attrs=None):                                                                                                                                                                
        from datetime import timedelta                                                                                                                                                                     
        output = []                                                                                                                                                                                        
        output.append(super(AdminDateWidget, self).render(name,value,attrs))                                                                                                                               
        if value:                                                                                                                                                                                          
            due_to = value + timedelta(days=1)                                                                                                                                                             
            output.append(u'<p>Diff : %s</p>' % due_to)                                                                                                                                   

        return mark_safe(u''.join(output))

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

Ответы [ 2 ]

1 голос
/ 08 декабря 2011

Если вы не возражаете против необходимости обновления, чтобы увидеть различие (то есть вы видите его только после сохранения модели), тогда более простой подход - добавить в администраторе поле только для чтения, которое указывает на функцию , вот так:

class MyModelAdmin(ModelAdmin):
    readonly_fields = ('dates_difference',)

    #add your other fields, or put it in a fieldset
    fields = ('dates_difference',)

    def dates_difference(self, model_instance):
        return model_instance.end_date - model_instance.start_date

Поскольку ваша цель - просто показать дополнительную информацию в администраторе модели, это место для размещения кода, а не в виджете поля или классе модели.

Как указано в документации readonly_fields , его поведение практически идентично поведению list_display , то есть вы можете указать его на атрибуты как модели, так и администратора модели, а также вызовы и методы.

1 голос
/ 08 декабря 2011

Переопределить save() в модели для сохранения вычисленных данных.

def save( self, *args, **kw ):
    self.diff = self.end_date - self.start_date
    return super( YourModelClass, self ).save( *args, **kw )

Узнайте больше, прочитав документацию Django по теме

...