Как в django в ChangeForm отображать значения полей readonly?

Есть модель "выплата". Нужно запретить менять, но иметь возможность просматривать все её поля в CashPaymentChangeForm. Как это сделать?

Если плохо сформулировал - после того как модель создана - нельзя её изменять, но в ChangeForm можно видеть все её поля в readonly.

Сама модель:

class ClientToCompanyPayment(models.Model):
    total = models.PositiveIntegerField(verbose_name='Сумма платежа', blank=False, null=False)
    date = models.DateField(verbose_name='Дата платежа', blank=False)
    client = models.ForeignKey(Client, verbose_name='Клиент')
    payment_id = models.CharField(verbose_name='ID платежа', max_length=40, blank=False,
                                  null=False, unique=True)

    def __str__(self):              # __unicode__ on Python 2
        return self.payment_id

    class Meta:
        abstract = True


class CashPayment(ClientToCompanyPayment):
    class Meta:
        db_table = 'cash_payments'


admin.py:

class CashPaymentCreationForm(forms.ModelForm):

    class Meta:
        model = CashPayment
        fields = ('client', )  # wat?

    def save(self, commit=True):
        payment = super(CashPaymentCreationForm, self).save(commit=False)
        if commit:
            payment.save()
        return payment


class CashPaymentChangeForm(forms.ModelForm):
    
    class Meta:
        model = CashPayment
        fields = ()

    def save(self, commit=True):
        payment = super(CashPaymentChangeForm, self).save(commit=False)
        if commit:
            payment.save()
        return payment


class CashPaymentAdmin(admin.ModelAdmin):
    form = CashPaymentChangeForm
    add_form = CashPaymentCreationForm

admin.site.register(CashPayment, CashPaymentAdmin)
  • Вопрос задан
  • 2397 просмотров
Решения вопроса 1
Не трогайте форму. Вы можете переопределить метод get_readonly_fields в admin-классе. Представляется, что это может выглядеть так:

class CashPaymentAdmin(admin.ModelAdmin):
    # ...
    def get_readonly_fields(self, request, obj=None):
        if obj:
            return ['total', 'date', 'client', 'payment_id']
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы