为了账号安全,请及时绑定邮箱和手机立即绑定

如果值为无,则 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 关注
  • 146 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号