2009-11-24 74 views
0

我想知道如何更改模型的字段参数,而不是在模型初始化期间,而是从模型管理员。举例来说,我愿作任何领域的“富”或“ - ”可选,根据上一个get参数(想了解的#伪代码位正确的解决方案):Django:从管理视图中更改模型字段

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) 

回答

1

您可能会遇到因为许多字段的属性都是在数据库级别表示的(例如,如果您执行的manage.py syncdb字段的值为null=False,则创建数据库字段的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'] 
相关问题