Изменить логическое значение в Django ModelForm - PullRequest
0 голосов
/ 30 ноября 2011

У меня есть поле в моей модели, которое указывает, хочет ли пользователь получать электронные письма

receive_invites = models.BooleanField(default=True, help_text="Receive an invite email from friends")

У меня также есть вид с опцией:

[x] Я не хочу получать письма ...

По по умолчанию receive_invites равно True поэтому флажок отмечен Однако я бы хотел, чтобы пользователь установил флажок, чтобы изменить receive_invites на False . Я сделал следующее в моей ModelForm, чтобы добиться этого. У кого-нибудь есть более элегантный способ сделать это?

class UnsubscribeForm(forms.ModelForm):        
    class Meta:
        model = Entrant
        fields = ('receive_invites')

    def __init__(self, *args, **kwargs):
        if kwargs.has_key('instance'):
            instance = kwargs['instance']
            if instance.receive_invites:
                instance.receive_invites = False
            else:
                instance.receive_invites = True
        super(UnsubscribeForm, self).__init__(*args, **kwargs)

и в представлении у меня есть это:

if request.method == 'POST':
    unsubscribe_form = UnsubscribeForm(request.POST, instance=me)

    if unsubscribe_form.is_valid():
        receive_invites = unsubscribe_form.cleaned_data['receive_invites']
        if receive_invites:
            user.receive_invites = False
        else:
            user.receive_invites = True
        unsubscribe_form.save()
        return redirect('index')
else:
    unsubscribe_form = UnsubscribeForm(instance=me)

Ответы [ 3 ]

0 голосов
/ 30 ноября 2011

Почему бы просто не убрать слова "не" из вида?

[x] Я хочу получать письма ...

В противном случае, я бы рекомендовал изменить UnsubscribeForm с ModelForm на обычный Form. Тогда вы можете инвертировать булевы все, что вы хотите, не прибегая к обману. Это больше работы, но она будет работать, если вы не можете просто поменять ярлык.

0 голосов
/ 04 декабря 2011

Добавляя к @DrTyrsa, неразумно проходить так много свёрток, чтобы просто следовать соглашению об именах полей.Если вы привязаны к этому имени поля, вы всегда можете добавить в модель свойство, которое сопоставляет поле данных со значением, которое вас волнует:

dont_receive_invites = models.BooleanField(default=False, help_text="Don't receive an invite email from friends")

@property
def receive_invites(self):
    return not self.dont_receive_invites
0 голосов
/ 30 ноября 2011

Вы не можете изменить модель?Если вы можете, вместо этого создайте dont_receive_invites поле и сэкономите много времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...