2013-07-02 3 views
1

Я использую Django-Profiles с Django 1.4, и мне нужен способ отменить подписку на пользователя, чтобы они могли перестать получать электронные письма.Django form checkbox, чтобы изменить значение в UserProfile

Одним из полей в моей модели 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 

Edit: Я добавил дополнительный контекст кода. если self.unsubscribe: находится в save() переопределении. Должно ли это быть где-то еще? Спасибо.

Редактировать 2: Я попытался изменить UnsubscribeForm несколькими способами. Теперь я получаю 404, No User соответствует данному запросу. Но вызываемая функция просмотра работает для других форм, поэтому я не уверен, почему?

urls.py

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'), 
     ) 

Эти два адреса называют один и тот же вид, только с использованием другого form_class.

Редактирование3: Так что я не знаю, почему, но когда я удаляю конечную косую черту с URL-адреса отмены подписки, форма, наконец, загружается. Но когда я отправляю форму, я все равно получаю сообщение об ошибке: объект «UnsubscribeForm» не имеет атрибута «unsubscribe». Если кто-нибудь может помочь мне понять, почему конечная косая черта приведет к ошибке 404 (ни один пользователь не отвечает заданному запросу) ум зная. Но как сейчас, форма нагрузки, но не представляет, а след заканчивается на этой линии моей формы:

if self.unsubscribe: 
+0

Было бы полезно иметь больше контекста кода. Является ли 'if self.unsubscribe:' функцией в классе? В каком классе это? – computmaxer

ответ

0

Отвечая на мой собственный вопрос снова. В ModelForms вы можете добавить элементы формы, которые не существуют в модели, и получить доступ к значению этих полей, обратившись к 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