Django Администратор изменить вид исключить поле, если значение Нет - PullRequest
0 голосов
/ 14 февраля 2020

В настоящее время мне нужно удалить некоторые поля из представления изменений, если их значения Нет enter image description here

Итак, у меня есть модель администрирования снятия средств, например:

class WithdrawalsAdminForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(WithdrawalsAdminForm, self).__init__(*args, **kwargs)
        none_fields = []
        for single_field in self.fields:
            self.fields[single_field].disabled = True
            if self.initial[single_field] == None:
                none_fields.append(single_field)
        if none_fields:
            for single_none_field in none_fields:
                self.fields.pop(single_none_field)

class WithdrawalsAdmin(admin.ModelAdmin):
    list_display = ('get_email', 'get_phone_number', 'currency', 'method', 'amount', 'status', 'created')
    list_display_links = ('get_email', 'get_phone_number', 'currency', 'method', 'amount', 'status', 'created')
    list_filter = [WithdrawalsStatusFilter] #just a custom list filter
    change_form_template = 'admin/backend/withdrawals_change_form.html'
    form = WithdrawalsAdminForm
    fields = (
        'id',
        'get_email',
        'get_phone_number',
        'get_full_name',
        'currency', 
        'method',
        'to_bank',
        'to_address',
        'to_card', 
        'amount', 
        'status', 
        'transaction_id',
        'created', 
        'submitted',
        'confirmed',
        )
    readonly_fields = (
        'id',
        'get_email',
        'get_phone_number',
        'get_full_name',
        'created', 
    )

    def has_add_permission(self, request, obj=None):
        return False

    def get_queryset(self, request):
        qs = super(WithdrawalsAdmin, self).get_queryset(request)
        return qs.filter(Q(method=1) | Q(method=4))

    def get_email(self, obj):
        return obj.user.email
    get_email.short_description = 'User email'
    get_email.admin_order_field = 'EMAIL'

    def get_phone_number(self, obj):
        return obj.user.phone_number
    get_phone_number.short_description = 'User phone number'
    get_phone_number.admin_order_field = 'PHONE NUMBER'

    def get_full_name(self, obj):
        try:
            user_kyc = UserKyc.objects.get(user=obj.user)
            return decrypt_string(user_kyc.full_name)
        except:
            return None
    get_full_name.short_description = 'User full name'
    get_full_name.admin_order_field = 'FULL NAME'


admin.site.register(Withdrawals, WithdrawalsAdmin)

Но он вернул мне следующую ошибку:

"Ключ 'to_address' не найден в 'WithdrawalsForm'. Возможны следующие варианты: сумма, валюта, метод, статус, to_bank."

сумма, валюта, метод, статус, to_bank все имеют значение not None в объекте

to_address значение None, я также пытался распечатать любое поле, которое отсутствует в if self.initial[single_field] == None: и получил правильное имя поля (включая to_address в нем), которое имеет значение None.

Как исключить поле, имеющее значение None, из представления изменений?

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

вы можете захотеть переписать методы get_fields и get_readonly_fields:

def _get_non_field_names(self, obj, candidate_fields):
    for field in candidate_fields:
        if hasattr(obj, field) and getattr(obj, field):
            yield field
        elif getattr(self, field)(obj):
            yield field

def get_fields(self, request, obj=None):
    form = self._get_form_for_get_fields(request, obj)
    candidate_fields = self.fields if self.fields else list(form.base_fields)
    fields = self._get_non_field_names(obj, candidate_fields)

    readonly_fields = list(self.get_readonly_fields(request, obj))
    return list(fields) + readonly_fields

def get_readonly_fields(self, request, obj=None):
    candidate_readonly_fields = self.readonly_fields
    readonly_fields = list(self._get_non_field_names(obj, candidate_readonly_fields))
    return readonly_fields
0 голосов
/ 19 февраля 2020

Сложная часть все еще о проверке значения None в настраиваемом поле.

В настоящее время я использую только следующие get_fields для проверки, не очень логично, но все еще могу удалить поле из формы:

def get_fields(self, request, obj=None):
    fields = super(WithdrawalsAdmin, self).get_fields(request, obj)
    fields_list = list(fields)
    if obj:
        if obj.to_address is None:
            fields_list.remove('to_address')
        .... #and other fields
    fields_tuple = tuple(fields_list)
    return fields_tuple
...