【问题标题】:Django: Altering model fields from admin viewsDjango:从管理视图中更改模型字段
【发布时间】:2009-11-24 13:35:08
【问题描述】:

我想知道如何更改模型字段的参数,而不是在模型初始化期间,而是从模型管理员那里。例如,我想根据 get 参数将字段“foo”或“bar”设为可选(想知道# PSEUDO CODE 位的正确解决方案):

def add_view(self, request, form_url='', extra_context=None):
    if request.GET.get('object_type', 'foo') == 'foo':
        # PSEUDO CODE:
        model.fields.foo.blank = False
        model.fields.bar.blank = True
    else:
        # PSEUDO CODE:
        model.fields.foo.blank = True
        model.fields.bar.blank = False
    return super(FileNodeAdmin, self).add_view(request, form_url, extra_context)

【问题讨论】:

    标签: django-models django-admin


    【解决方案1】:

    您可能会遇到麻烦,因为许多字段的属性都是在数据库级别表示的(即,如果您对具有 null=False 的字段执行 manage.py syncdb,则创建数据库字段的 DDL 将具有NOT NULL)。动态改变数据库约束的行为几乎是不可能的。

    我首选的处理您所描述内容的方法是在表单级别,而不是在模型级别。我的模型将是通用的并允许所有允许的状态(例如,如果在某些情况下字段可以为空,但在其他情况下不能为空,只需设置 null=True)。然后,我将动态更改 django.form 实例以更改其验证方式,或者仅在我的视图中手动进行验证。您甚至可能需要一个表单的实例,每个实例都有略微不同的约束,并根据您的 GET 决定使用哪一个。在伪代码中:

    def view(request):
        if request.GET.get('object_type', 'foo') == 'foo':
            f = FooForm(request) # FooForm let's bar be blank, while foo can not be blank
            if f.is_valid():
                a = f.cleaned_data['a']
                ...
        else:
            f = BarForm(request) # BarForm let's foo be blank, while bar can not be blank
            if f.is_valid():
                a = f.cleaned_data['a'] 
    

    【讨论】: