2014-02-13 89 views
1

Two scoops of Django建議做一個自定義驗證的形式如下:如何將當前用戶傳遞給自定義表單驗證器?

class MyModel(models.Model): 
    body = models.TextField() 
    repo_name = models.CharField(max_length=50) 


def validate_repo_existance(value): 
    # Validate repo existance. 
    # This needs the Github account which is bound 
    # to the user account though. 


class MyModelForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(MyModelForm, self).__init__(*args, **kwargs) 
     self.fields["repo_name"].validators.append(validate_repo_existance) 

    class Meta: 
     model = MyModel 

有沒有辦法通過,是表單頁面自定義驗證的用戶?

回答

0

這就是我一直在尋找:

views.py

form = MyModelForm(request.user) # when unbound 

form = MyModelForm(request.user, data=request.POST) # when bound 

validators.py

class RepoValidator(object): 
    def __init__(self, user): 
     self.user = user 

    def __call__(self, value): 
     #self.user and value are accessible from here 

forms.py

class MyModelForm(forms.ModelForm): 
    def __init__(self, user, *args, **kwargs): 
     super(MyModelForm, self).__init__(*args, **kwargs) 
     self.fields["repo_name"].append(RepoValidator(user)) 

    class Meta: 
     model = MyModel 
1
class MyModelForm(forms.ModelForm): 
    def __init__(self, user, *args, **kwargs): 
     super(MyModelForm, self).__init__(*args, **kwargs) 
     self.fields["repo_name"].validator.append(validate_repo_existance) 

又通從用戶看來你實例形式:

form = MyModelForm(request.user) # when unbound 

form = MyModelForm(request.user, data=request.POST) # when bound 

這種模式被用於那些需要傳遞給Django的任何其它數據。

+0

很酷,但我怎麼能'__init__'方法''用戶''validate_repo_existance'?看來你只能傳遞一個沒有參數的函數對象。 – Bentley4

+1

對於簡單的字段驗證'clean_fieldname()'方法就足夠了,如果你正在基於多個字段中的值進行驗證,使用'clean()'方法。如果你需要使用驗證器(順便說一句,你可能意思是'self.validators.fields [「repo_name」]。append(validate_repo_existance)',你跳過了'validators'部分),你可以使用一個在構造函數中獲取用戶的類。看看Django如何做到這一點:https://github.com/django/django/blob/master/django/forms/fields.py#L212 – waverider

+0

謝謝你爲我提供了重要的線索。另外,感謝您的糾正,我忘了在我的問題中編寫'validators'屬性(但它是在我的真實代碼中)。 – Bentley4

1

當前用戶存儲在請求對象中,可以通過request.user訪問。您可以將此用戶作爲參數傳遞給表單。

相關問題