亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果值為無,則 Django 管理員更改視圖排除字段

如果值為無,則 Django 管理員更改視圖排除字段

森林海 2022-07-26 21:59:50
目前我需要從更改視圖中刪除一些字段,如果它的值為無所以我有一個取款模型的管理員,如下所示: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))但它返回給我以下錯誤:“在‘WithdrawalsForm’中找不到鍵‘to_address’。選項有:金額、貨幣、方法、狀態、to_bank?!苯痤~、貨幣、方法、狀態、to_bank 在對象中的值都不是 Noneto_address 值是 None,我還嘗試打印出任何沒有的字段,if self.initial[single_field] == None:并得到正確的字段名稱(其中包括 to_address)具有 None 值。如何從更改視圖中排除具有 None 值的字段?
查看完整描述

2 回答

?
拉莫斯之舞

TA貢獻1820條經驗 獲得超10個贊

您可能需要重寫 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


查看完整回答
反對 回復 2022-07-26
?
繁星coding

TA貢獻1797條經驗 獲得超4個贊

困難的部分仍然是在自定義字段上檢查 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


查看完整回答
反對 回復 2022-07-26
  • 2 回答
  • 0 關注
  • 138 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號