2013-07-02 5 views
1

Django 1.4에서 Django-Profiles를 사용하고 있으며 이메일 수신을 중단 할 수 있도록 사용자 탈퇴 방법이 필요합니다.UserProfile의 값을 변경하는 Django 양식 체크 박스

내 UserProfile 모델의 필드 중 하나가 user_type이고 USER_TYPES 선택 목록이 있습니다. 그들이 취소하더라도 시스템에서 사용자를 유지하기 위해, 나는 USER_TYPES 중 하나가 InactiveClient 수로 결정, 나는 확인란과 같이 포함 것 :

Models.py :

USER_TYPES = (
    ('Editor', 'Editor'), 
    ('Reporter', 'Reporter'), 
    ('Client', 'Client'), 
    ('InactiveClient', 'InactiveClient'), 
    ('InactiveReporter', 'InactiveReporter'), 
) 

class UserProfile(models.Model): 
    user = models.OneToOneField(User, unique=True) 
    user_type = models.CharField(max_length=25, choices=USER_TYPES, default='Client') 
    ... etc. 

형태. 평

class UnsubscribeForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(UnsubscribeForm, self).__init__(*args, **kwargs) 
     try: 
      self.initial['email'] = self.instance.user.email 
      self.initial['first_name'] = self.instance.user.first_name 
      self.initial['last_name'] = self.instance.user.last_name 
     except User.DoesNotExist: 
      pass 
    email = forms.EmailField(label='Primary Email') 
    first_name = forms.CharField(label='Editor first name') 
    last_name = forms.CharField(label='Editor last name')  
    unsubscribe = forms.BooleanField(label='Unsubscribe from NNS Emails') 

    class Meta: 
     model = UserProfile 
     fields = ['first_name','last_name','email','unsubscribe'] 

    def save(self, *args, **kwargs): 
     u = self.instance.user 
     u.email = self.cleaned_data['email'] 
     u.first_name = self.cleaned_data['first_name'] 
     u.last_name = self.cleaned_data['last_name'] 
     if self.unsubscribe: 
      u.get_profile().user_type = 'InactiveClient' 
     u.save() 
     client = super(UnsubscribeForm, self).save(*args,**kwargs) 
     return client 

편집 : 나는 추가 코드 컨텍스트를 추가했습니다. 만약 self.unsubscribe :가 save() override에있다. 그게 다른 곳에 있어야할까요? 고맙습니다.

편집 2 : 여러 가지 방법으로 UnsubscribeForm을 변경해 보았습니다. 이제 404가 나오는데, 주어진 쿼리와 일치하는 사용자 없음. 하지만 호출되는 뷰 기능은 다른 형식에서도 작동하므로 왜 그런지 모르겠습니다.

이 두 URL을 그냥 다른 form_class를 사용하여, 동일한 뷰를 호출

urlpatterns = patterns('', 
    url('^client/edit', 'profiles.views.edit_profile', 
     { 
      'form_class': ClientForm, 
      'success_url': '/profiles/client/edit/', 
     }, 
     name='edit_client_profile'), 
    url('^unsubscribe', 'profiles.views.edit_profile', 
     { 
      'form_class': UnsubscribeForm, 
      'success_url': '/profiles/client/edit/', 
     }, 
     name='unsubscribe'), 
     ) 

urls.py.

편집 3 : 그래서 이유는 모르지만 탈퇴 URL에서 후행 슬래시를 제거하면 양식이로드됩니다. 하지만 양식을 제출할 때 여전히 오류가 발생합니다. 'UnsubscribeForm'객체에 'unsubscribe'속성이 없습니다. 후미 슬래시가 404 오류 (사용자가 지정된 검색어와 일치하지 않음)를 발생시키는 이유를 이해할 수있는 사람이 있다면 마음 알고. 그러나 지금과 같은 형태의로드하지만, 제출하지 않으며, 추적은 내 양식의이 라인에 끝 :

if self.unsubscribe: 
+0

더 코드 컨텍스트가 도움이 될 것이다 :

이 방법을 저장할의 나 무엇처럼 보인다. 클래스의 함수에서'if self.unsubscribe :'입니까? 어떤 계급입니까? – computmaxer

답변

0

을 다시 내 자신의 질문에 대답. ModelForms에서는 모델에 존재하지 않는 양식 요소를 추가하고 save 메소드에서 self.cleaned_data [ 'form_element_name']에 액세스하여 해당 필드의 값에 액세스 할 수 있습니다.

def save(self, *args, **kwargs): 
    u = self.instance.user 
    p = self.instance.user.get_profile() 
    u.email = self.cleaned_data['email'] 
    u.first_name = self.cleaned_data['first_name'] 
    u.last_name = self.cleaned_data['last_name'] 
    if self.cleaned_data['unsubscribe']: 
     p.user_type = 'InactiveClient' 
    u.save() 
    p.save() 
    client = super(UnsubscribeForm, self).save(*args,**kwargs) 
    return client 
관련 문제