2017-02-25 2 views
0

장고 양식에 요청을 전달하는 방법은 무엇입니까?Django 폼에 요청을 전달하는 방법은 무엇입니까?

사용자가 프로필 이메일을 변경할 수있는 django 업데이트 프로필 양식을 만들고 있습니다. 양식의 이메일이 로그인 한 사용자에게 속하는지 확인하고 싶지 않은 경우이 이메일이 새로운 사용자 이메일로 설정되기 전에 다른 사용자가 사용했는지 확인하고 싶습니다.

def clean_email(self): 
     email = self.cleaned_data.get("email") 
     owns_email = (email != self.request.user.email) 
     if User.objects.filter(email__icontains=email).exists() and owns_email: 
      raise forms.ValidationError("This email aldready registered.") 
     return email 

그래서 어쩌면 내 문제를 해결하기 위해 더 나은 솔루션이있다 : 여기

내 코드와 작동하지 않습니다 self.request.user.email이 입니까?

+1

사용중인보기 어떤 종류의? 그것은 cbv 또는 fbv입니까? – Fred

+0

클래스 기반보기를 사용하고 있습니다. – django11

답변

2

, 당신은 FormMixin에서 get_form_kwargs 기능을 사용할 수 있습니다 귀하의 형태는 다음과 같이 보일 것입니다. 그것은 다음과 같이 보일 수

:

class UserProfileUpdateView(UpdateView): 
... 
    def get_form_kwargs(self): 
    '''This goes in the Update view''' 
     kwargs = super(UserProfileUpdateView, self).get_form_kwargs() #put your view name in the super 
     user = self.request.user 

     if user: 
      kwargs['user'] = user 

     return kwargs 

그런 다음 폼 클래스가 위의 코드에 따라이 같은, 보일 것이다 :

class UserProfileUpdateForm: 
... 
    def __init__(self, *args, **kwargs): 
     if kwargs.get('user'): 
      self.user = kwargs.pop('user', None) 
     super(UserProfileUpdateForm, self).__init__(*args,**kwargs) 

    def clean_email(self): 
     email = self.cleaned_data.get("email") 
     owns_email = (email != self.user.email) 
     if User.objects.filter(email__icontains=email).exists() and owns_email: 
      raise forms.ValidationError("This email already registered.") 
     return email 
2

양식에 Request 개체가 없습니다. 생성자에서 현재 로그인 한 사용자를 수동으로 전달해야합니다.

class UserProfileForm(forms.Form): 
    user = None 

    def __init__(self, *args, **kwargs): 
     self.user = kwargs.pop('user') 
     super(UserProfileForm, self).__init__(*args, **kwargs) 

    ... 
    def clean_email(self): 
     email = self.cleaned_data['email'] 
     owns_email = (email != self.user.email) 
     if User.objects.filter(email__icontains=email).exists() and owns_email: 
      raise forms.ValidationError('This email already registered.') 
     return email 
    ... 

보기에서 폼을 인스턴스화 : 당신이 CBV를 사용하고 있기 때문에

def edit_profile(request): 
    form = UserProfileForm(user=request.user) 
    ... 
관련 문제