2011-02-09 29 views
11

我有這樣一個模型:我怎樣才能在一個Django的形式禁用模型場

class MyModel(models.Model): 
    REGULAR = 1 
    PREMIUM = 2 
    STATUS_CHOICES = ((REGULAR, "regular"), (PREMIUM, "premium")) 
    name = models.CharField(max_length=30) 
    status = models.IntegerField(choices = STATUS_CHOICES, default = REGULAR) 

class MyForm(forms.ModelForm): 
    class Meta: 
     model = models.MyModel 

在視圖中我初始化一個字段,並努力使之不可編輯:

myform = MyForm(initial = {'status': requested_status}) 
myform.fields['status'].editable = False 

但用戶仍然可以更改該字段。

什麼是真正的方式來完成我後?

回答

33

步驟1:禁用前端部件

使用HTML readonly屬性:
http://www.w3schools.com/tags/att_input_readonly.asp

或者disabled屬性:
http://www.w3.org/TR/html401/interact/forms.html#adef-disabled

你可以注入通過任意的HTML鍵值對小工具attrs屬性:

myform.fields['status'].widget.attrs['readonly'] = True # text input 
myform.fields['status'].widget.attrs['disabled'] = True # radio/checkbox 

步驟2:確保該字段上後端

重寫爲您的字段的清潔方法有效地禁用POST輸入的這樣不管(有人可以假一POST,編輯原始HTML等)你會得到已經存在的字段值。

def clean_status(self): 
    # when field is cleaned, we always return the existing model field. 
    return self.instance.status 
+0

只讀屬性是它。謝謝! – jammon 2011-02-09 15:05:00

+2

「self.instance.status」的訣竅非常好。 – jammon 2011-02-09 15:05:55

5

您是否嘗試過使用排除功能?

像這樣

class PartialAuthorForm(ModelForm): 
class Meta: 
    model = Author 
    fields = ('name', 'title') 

class PartialAuthorForm(ModelForm): 
class Meta: 
    model = Author 
    exclude = ('birth_date',) 

Reference Here

4

只需定製控件實例狀態字段:

class MyModel(models.Model): 
    REGULAR = 1 
    PREMIUM = 2 
    STATUS_CHOICES = ((REGULAR, "regular"), (PREMIUM, "premium")) 
    name = models.CharField(max_length=30) 
    status = models.IntegerField(choices = STATUS_CHOICES, default = REGULAR) 

class MyForm(forms.ModelForm): 
    status = forms.CharField(widget=forms.TextInput(attrs={'readonly':'True'})) 

    class Meta: 
     model = models.MyModel 

見:Django Documentation

2

從Django中1.9:

self.fields['whatever'].disabled = True