2010-05-19 51 views
4

删除字段我有一个模型,它是访问通过Django管理区域,类似如下:Django管理 - 如果编辑对象

# model 
class Foo(models.Model): 
    field_a = models.CharField(max_length=100) 
    field_b = models.CharField(max_length=100) 

# admin.py 
class FooAdmin(admin.ModelAdmin): 
    pass 

比方说,我想说明,如果用户field_a和field_b正在添加一个对象,但如果用户正在编辑对象,则只能添加field_a。有没有简单的方法来做到这一点,也许使用fields属性?

如果说到它,我可以破解一个JavaScript解决方案,但根本不适合这样做!

回答

5

您可以创建自定义ModelForm为管理员滴在__init__

class FooForm(forms.ModelForm): 
    class Meta(object): 
     model = Foo 

    def __init__(self, *args, **kwargs): 
     super(FooForm, self).__init__(*args, **kwargs) 
     if self.instance and self.instance.pk: 
      # Since the pk is set this is not a new instance 
      del self.fields['field_b'] 

class FooAdmin(admin.ModelAdmin): 
    form = FooForm 

编辑的字段:从约翰的评论以暗示要进行现场只读,你可以把这个隐藏字段并重写clean以确保值不会更改。

class FooForm(forms.ModelForm): 
    class Meta(object): 
     model = Foo 

    def __init__(self, *args, **kwargs): 
     super(FooForm, self).__init__(*args, **kwargs) 
     if self.instance and self.instance.pk: 
      # Since the pk is set this is not a new instance 
      self.fields['field_b'].widget = forms.HiddenInput() 

    def clean_field_b(self): 
     if self.instance and self.instance.pk: 
      return self.instance.field_b 
     else: 
      return self.cleaned_data['field_b'] 
+0

谢谢您的回答上当受骗!它看起来应该可以工作,但编辑对象时出现TemplateSyntaxError - “Form'中找不到Key”field_b“。任何想法如何解决? – 2010-05-19 15:49:44

+0

我通过将字段更改为CharField(它最初是一个选择列表)并将其标记为只读 - 这对我的目的来说很好。类似于:self.fields ['field_b'] = forms.CharField(ini​​tial =“initial value”); self.fields ['field_b']。widget.attrs ['readonly'] =真 – 2010-05-19 16:03:24

+0

废话我忘了管理员使用ModelAdmin字段集而不是模型上的字段来生成模板,但我很高兴你得到它的工作出。 – 2010-05-19 16:10:41

0

你也可以做以下

class FooAdmin(admin.ModelAdmin) 
    def change_view(self, request, object_id, extra_context=None):  
     self.exclude = ('field_b',) 
     return super(SubSectionAdmin, self).change_view(request, object_id, extra_context) 

从这里Django admin: exclude field on change form only